Other fitness landscapes

Setup

library(ggplot2)
library(tidyverse)
library(knitr)
library(cowplot)
library(viridis)
library(RColorBrewer)
library(rstatix)
library(ggsignif)
library(Hmisc)
library(kableExtra)
source("https://gist.githubusercontent.com/benmarwick/2a1bb0133ff568cbe28d/raw/fb53bd97121f7f9ce947837ef1a4c65a73bffb3f/geom_flat_violin.R")
library(readr)
library(stringr)
library(ggpubr)
library(infotheo)
library(osfr)
library(scales)

These analyses were conducted in the following computing environment:

print(version)
##                _                           
## platform       x86_64-pc-linux-gnu         
## arch           x86_64                      
## os             linux-gnu                   
## system         x86_64, linux-gnu           
## status                                     
## major          4                           
## minor          0.4                         
## year           2021                        
## month          02                          
## day            15                          
## svn rev        80002                       
## language       R                           
## version.string R version 4.0.4 (2021-02-15)
## nickname       Lost Library Book
# Labeler for stats annotations
p_label <- function(p_value) {
  threshold = 0.0001
  if (p_value < threshold) {
    return(paste0("p < ", threshold))
  } else {
    return(paste0("p = ", p_value))
  }
}

# Significance threshold
alpha <- 0.05

####### misc #######
# Configure our default graphing theme
theme_set(theme_cowplot())
osf_retrieve_file("p79hx") %>% osf_download(conflicts = "skip")  # Download data from osf
## # A tibble: 1 x 4
##   name                   id                local_path               meta        
##   <chr>                  <chr>             <chr>                    <list>      
## 1 complex_fitness_lands… 612fe4d84e5ee501… ./complex_fitness_lands… <named list…
data_loc <- "complex_fitness_landscapes.csv"

data <- read_csv(data_loc, na=c("NONE", "NA", ""))

data <- data %>% 
  filter(N==20, generation %%10 == 0) %>%
  mutate(
  selection_name = as.factor(case_when(
    SELECTION == 0 ~ "Tournament",
    SELECTION == 1 ~ "Fitness sharing",
    SELECTION == 2 ~ "Lexicase",
    SELECTION == 3 ~ "Eco-EA",
    SELECTION == 4 ~ "Random",
  )), 
  problem_name = as.factor(case_when(
    PROBLEM == 0 ~ "NK Landscape",
    PROBLEM == 1 ~ "Count Odds",
    PROBLEM == 2 ~ "Real-valued optimization",
    PROBLEM == 3 ~ "Sorting network",
    PROBLEM == 4 ~ "Logic-9"    
  ))
)

data <- filter(data, generation <= 2000)
final_data <- filter(data, generation==max(data$generation))

Performance

Over time

ggplot(
    data,
    aes(
      x=generation,
      y=max_performance,
      color=selection_name,
      fill=selection_name
    )
  ) +
  stat_summary(geom="line", fun=mean) +
  stat_summary(
    geom="ribbon",
    fun.data="mean_cl_boot",
    fun.args=list(conf.int=0.95),
    alpha=0.2,
    linetype=0
  ) +
  scale_y_continuous(
    name="Average trait performance"
  ) +
  scale_x_continuous(
    name="Generation"
  ) +
  scale_color_discrete("Selection") + 
  scale_fill_discrete("Selection") +
  facet_wrap(~problem_name, scales="free")

Final

# Compute manual labels for geom_signif
stat.test <- final_data %>%
  wilcox_test(max_performance ~ selection_name) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance() %>%
  add_xy_position(x="selection_name",step.increase=1)
#stat.test$manual_position <- stat.test$y.position * .5
#stat.test$manual_position <- c(110, 1100, 170, 170, 130, 110)
stat.test$label <- mapply(p_label,stat.test$p.adj)
ggplot(
    final_data,
    aes(
      x=selection_name,
      y=max_performance,
      fill=selection_name
    )
  ) +
  geom_boxplot() +
  scale_y_continuous(
    name="Average trait performance"
  ) +
  scale_x_discrete(
    name="Selection"
  ) +
  scale_fill_discrete(
    name="Selection"
  ) +
  scale_color_discrete(
    name="Selection"
  ) + 
  theme(legend.position="none") +
  facet_wrap(~problem_name, scales="free")

stat.test %>%
  kbl() %>%
  kable_styling(
    bootstrap_options = c(
      "striped",
      "hover",
      "condensed",
      "responsive"
    )
  ) %>%
  scroll_box(width="600px")
.y. group1 group2 n1 n2 statistic p p.adj p.adj.signif y.position groups xmin xmax label
max_performance Eco-EA Fitness sharing 240 240 28898.5 9.49e-01 1.00e+00 ns 102283.6 Eco-EA , Fitness sharing 1 2 p = 1
max_performance Eco-EA Lexicase 240 240 22536.0 3.25e-05 3.25e-04 *** 135739.0 Eco-EA , Lexicase 1 3 p = 0.000325
max_performance Eco-EA Random 240 240 38664.0 0.00e+00 0.00e+00 **** 169194.5 Eco-EA, Random 1 4 p < 1e-04
max_performance Eco-EA Tournament 240 240 28335.5 7.59e-01 1.00e+00 ns 202649.9 Eco-EA , Tournament 1 5 p = 1
max_performance Fitness sharing Lexicase 240 240 21248.5 7.00e-07 6.50e-06 **** 236105.4 Fitness sharing, Lexicase 2 3 p < 1e-04
max_performance Fitness sharing Random 240 240 40208.0 0.00e+00 0.00e+00 **** 269560.8 Fitness sharing, Random 2 4 p < 1e-04
max_performance Fitness sharing Tournament 240 240 26515.0 1.33e-01 1.00e+00 ns 303016.3 Fitness sharing, Tournament 2 5 p = 1
max_performance Lexicase Random 240 240 44119.5 0.00e+00 0.00e+00 **** 336471.7 Lexicase, Random 3 4 p < 1e-04
max_performance Lexicase Tournament 240 240 35022.0 3.93e-05 3.93e-04 *** 369927.2 Lexicase , Tournament 3 5 p = 0.000393
max_performance Random Tournament 240 240 17928.5 0.00e+00 0.00e+00 **** 403382.6 Random , Tournament 4 5 p < 1e-04

Phylogenetic diversity

Relationship between different types of pylogenetic diversity

First, to get a big-picture overview, we make correlation matrices of all the different phylogenetic diversity metrics:

final_data %>% 
  transmute(MinPD=min_phenotype_pairwise_distance, 
            MeanPD=mean_phenotype_pairwise_distance, 
            MaxPD=max_phenotype_pairwise_distance, 
            VarPD=variance_phenotype_pairwise_distance, 
            MinED = min_phenotype_evolutionary_distinctiveness,
            MeanED= mean_phenotype_evolutionary_distinctiveness,
            MaxED=max_phenotype_evolutionary_distinctiveness,
            VarED=variance_phenotype_evolutionary_distinctiveness,
            PD=phenotype_current_phylogenetic_diversity,  # See Faith 1992
            MRCA=phenotype_mrca_depth,  # Phylogenetic depth of most recent common ancestor
            N=phenotype_num_taxa     # Number of taxonomically-distinct phenotypes
  ) %>%
  cor_mat() %>% 
  pull_lower_triangle() %>% 
  cor_plot()

However, these correlations may well vary by selection scheme and by problem, and even over time within a selection scheme and problem. Let’s take a look at some scatter plots.

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=mean_phenotype_pairwise_distance,
        x=variance_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=mean_phenotype_pairwise_distance,
        x=max_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=variance_phenotype_pairwise_distance,
        x=max_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==500),
    aes(
        y=mean_phenotype_pairwise_distance,
        x=variance_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==500),
    aes(
        y=mean_phenotype_pairwise_distance,
        x=max_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=variance_phenotype_pairwise_distance,
        x=max_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=mean_phenotype_evolutionary_distinctiveness,
        x=variance_phenotype_evolutionary_distinctiveness,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=mean_phenotype_evolutionary_distinctiveness,
        x=max_phenotype_evolutionary_distinctiveness,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=mean_phenotype_evolutionary_distinctiveness,
        x=min_phenotype_evolutionary_distinctiveness,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==500),
    aes(
        y=mean_phenotype_evolutionary_distinctiveness,
        x=variance_phenotype_evolutionary_distinctiveness,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==500),
    aes(
        y=mean_phenotype_evolutionary_distinctiveness,
        x=max_phenotype_evolutionary_distinctiveness,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==500),
    aes(
        y=mean_phenotype_evolutionary_distinctiveness,
        x=min_phenotype_evolutionary_distinctiveness,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
  scale_x_continuous(
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

Over time

ggplot(
    data,
    aes(
      x=generation,
      y=mean_phenotype_pairwise_distance,
      color=selection_name,
      fill=selection_name
    )
  ) +
  stat_summary(geom="line", fun=mean) +
  stat_summary(
    geom="ribbon",
    fun.data="mean_cl_boot",
    fun.args=list(conf.int=0.95),
    alpha=0.2,
    linetype=0
  ) +
  scale_y_log10(
    name="Mean pairwise distance"
  ) +
  scale_x_continuous(
    name="Generation"
  ) +
  scale_color_discrete("Selection") +
  scale_fill_discrete("Selection") +
  facet_wrap(~problem_name, scales = "free")

Final

# Compute manual labels for geom_signif
stat.test <- final_data %>%
  wilcox_test(mean_phenotype_pairwise_distance ~ selection_name) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance() %>%
  add_xy_position(x="selection_name",step.increase=1)
#stat.test$manual_position <- stat.test$y.position * .5
#stat.test$manual_position <- c(110, 150, 170, 170, 130, 110)
stat.test$label <- mapply(p_label,stat.test$p.adj)
ggplot(
    final_data,
    aes(
      x=selection_name,
      y=mean_phenotype_pairwise_distance,
      fill=selection_name
    )
  ) +
  geom_boxplot() +
  scale_y_log10(
    name="Mean pairwise distance"
  ) +
  scale_x_discrete(
    name="Selection"
  ) +
  scale_fill_discrete(
    name="Selection"
  ) +
  scale_color_discrete(
    name="Selection"
  ) + 
  theme(legend.position = "none") +
    facet_wrap(~problem_name, scales = "free")

stat.test %>%
  kbl() %>%
  kable_styling(
    bootstrap_options = c(
      "striped",
      "hover",
      "condensed",
      "responsive"
    )
  ) %>%
  scroll_box(width="600px")
.y. group1 group2 n1 n2 statistic p p.adj p.adj.signif y.position groups xmin xmax label
mean_phenotype_pairwise_distance Eco-EA Fitness sharing 240 240 2486.0 0.00e+00 0.00e+00 **** 2900.227 Eco-EA , Fitness sharing 1 2 p < 1e-04
mean_phenotype_pairwise_distance Eco-EA Lexicase 240 240 23590.0 6.07e-04 6.07e-03 ** 4498.579 Eco-EA , Lexicase 1 3 p = 0.00607
mean_phenotype_pairwise_distance Eco-EA Random 240 240 8274.0 0.00e+00 0.00e+00 **** 6096.931 Eco-EA, Random 1 4 p < 1e-04
mean_phenotype_pairwise_distance Eco-EA Tournament 240 240 43940.0 0.00e+00 0.00e+00 **** 7695.284 Eco-EA , Tournament 1 5 p < 1e-04
mean_phenotype_pairwise_distance Fitness sharing Lexicase 240 240 35067.0 3.72e-05 3.72e-04 *** 9293.636 Fitness sharing, Lexicase 2 3 p = 0.000372
mean_phenotype_pairwise_distance Fitness sharing Random 240 240 37442.0 0.00e+00 1.00e-07 **** 10891.988 Fitness sharing, Random 2 4 p < 1e-04
mean_phenotype_pairwise_distance Fitness sharing Tournament 240 240 57033.0 0.00e+00 0.00e+00 **** 12490.340 Fitness sharing, Tournament 2 5 p < 1e-04
mean_phenotype_pairwise_distance Lexicase Random 240 240 26406.0 1.15e-01 1.00e+00 ns 14088.693 Lexicase, Random 3 4 p = 1
mean_phenotype_pairwise_distance Lexicase Tournament 240 240 36500.5 4.00e-07 4.00e-06 **** 15687.045 Lexicase , Tournament 3 5 p < 1e-04
mean_phenotype_pairwise_distance Random Tournament 240 240 55686.0 0.00e+00 0.00e+00 **** 17285.397 Random , Tournament 4 5 p < 1e-04

Phenotypic diversity

Relationship between different types of phenotypic diversity

First, we should assess the extent to which different metrics of phenotypic diversity are capturing different information.

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=phenotype_diversity,
        x=phenotype_num_taxa,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Phenotypic shannon diversity"
  ) +
  scale_x_continuous(
        name="Phenotypic richness",
        breaks = breaks_extended(4)
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

Over time

ggplot(
    data,
    aes(
      x=generation,
      y=phenotype_num_taxa,
      color=selection_name,
      fill=selection_name
    )
  ) +
  stat_summary(geom="line", fun=mean) +
  stat_summary(
    geom="ribbon",
    fun.data="mean_cl_boot",
    fun.args=list(conf.int=0.95),
    alpha=0.2,
    linetype=0
  ) +
  scale_y_continuous(
    name="Phenotypic richness"
  ) +
  scale_x_continuous(
    name="Generation"
  ) +
  scale_color_discrete("Selection") + 
  scale_fill_discrete("Selection") +
  facet_wrap(~problem_name, scales = "free")

Final

# Compute manual labels for geom_signif
stat.test <- final_data %>%
  wilcox_test(phenotype_num_taxa ~ selection_name) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance() %>%
  add_xy_position(x="selection_name",step.increase=1)
#stat.test$manual_position <- stat.test$y.position * .5
#stat.test$manual_position <- c(110, 150, 170, 170, 130, 110)
stat.test$label <- mapply(p_label,stat.test$p.adj)
ggplot(
    final_data,
    aes(
      x=selection_name,
      y=phenotype_num_taxa,
      fill=selection_name
    )
  ) +
  geom_boxplot() +
  scale_y_continuous(
    name="Phenotypic Richness"
  ) +
  scale_x_discrete(
    name="Selection"
  ) +
  scale_fill_discrete(
    name="Selection"
  ) +
  scale_color_discrete(
    name="Selection"
  ) +
  theme(legend.position = "none") +
  facet_wrap(~problem_name, scales = "free")

stat.test %>%
  kbl() %>%
  kable_styling(
    bootstrap_options = c(
      "striped",
      "hover",
      "condensed",
      "responsive"
    )
  ) %>%
  scroll_box(width="600px")
.y. group1 group2 n1 n2 statistic p p.adj p.adj.signif y.position groups xmin xmax label
phenotype_num_taxa Eco-EA Fitness sharing 240 240 3513.5 0.00000 0.0000 **** 1580.000 Eco-EA , Fitness sharing 1 2 p < 1e-04
phenotype_num_taxa Eco-EA Lexicase 240 240 17757.5 0.00000 0.0000 **** 2224.444 Eco-EA , Lexicase 1 3 p < 1e-04
phenotype_num_taxa Eco-EA Random 240 240 38186.0 0.00000 0.0000 **** 2868.889 Eco-EA, Random 1 4 p < 1e-04
phenotype_num_taxa Eco-EA Tournament 240 240 30723.0 0.20600 1.0000 ns 3513.333 Eco-EA , Tournament 1 5 p = 1
phenotype_num_taxa Fitness sharing Lexicase 240 240 39523.5 0.00000 0.0000 **** 4157.778 Fitness sharing, Lexicase 2 3 p < 1e-04
phenotype_num_taxa Fitness sharing Random 240 240 56742.5 0.00000 0.0000 **** 4802.222 Fitness sharing, Random 2 4 p < 1e-04
phenotype_num_taxa Fitness sharing Tournament 240 240 49804.5 0.00000 0.0000 **** 5446.667 Fitness sharing, Tournament 2 5 p < 1e-04
phenotype_num_taxa Lexicase Random 240 240 46856.0 0.00000 0.0000 **** 6091.111 Lexicase, Random 3 4 p < 1e-04
phenotype_num_taxa Lexicase Tournament 240 240 41709.5 0.00000 0.0000 **** 6735.556 Lexicase , Tournament 3 5 p < 1e-04
phenotype_num_taxa Random Tournament 240 240 23410.5 0.00039 0.0039 ** 7380.000 Random , Tournament 4 5 p = 0.0039

Relationship between phenotypic and phylogenetic diversity

ggplot(
    final_data,
    aes(
        y=phenotype_num_taxa,
        x=mean_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Phenotypic richness"
  ) +
  scale_x_continuous(
        name="Mean pairwise distance"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

Relationship between diversity and success

Earlier in run

ggplot(
    data %>% filter(generation==500),
    aes(
        y=max_performance,
        x=mean_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Average trait performance"
  ) +
  scale_x_continuous(
        name="Mean pairwise distance"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    data %>% filter(generation==500),
    aes(
        y=max_performance,
        x=phenotype_num_taxa,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Average trait performance"
  ) +
  scale_x_continuous(
        name="Phenotypic richness"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

phylogney_vs_performance <- ggplot(
    data %>% filter(generation==1000),
    aes(
        y=max_performance,
        x=mean_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Average trait performance"
  ) +
  scale_x_continuous(
        name="Mean pairwise distance"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")
  
phylogney_vs_performance

ggplot(
    data %>% filter(generation==1000),
    aes(
        y=max_performance,
        x=phenotype_num_taxa,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Average trait performance"
  ) +
  scale_x_continuous(
        name="Phenotypic richness"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

End of run

ggplot(
    final_data,
    aes(
        y=max_performance,
        x=mean_phenotype_pairwise_distance,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Average trait performance"
  ) +
  scale_x_continuous(
        name="Mean pairwise distance"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

ggplot(
    final_data,
    aes(
        y=max_performance,
        x=phenotype_num_taxa,
        color=selection_name,
        fill=selection_name
    )
  ) +
  geom_point() +
    scale_y_continuous(
        name="Average trait performance"
  ) +
  scale_x_continuous(
        name="Phenotypic richness"
  ) + 
  facet_wrap(
      ~selection_name*problem_name, ncol=4, scales="free"
  ) + 
  stat_smooth(
    method="lm"
  ) + 
  stat_cor(
    method="spearman", cor.coef.name = "rho", color="black"
  ) +
  theme(legend.position = "none")

Causality analysis

Setup

First let’s define a function we’ll use to calculate and output significance and effect size for these results:

transfer_entropy_stats <- function(res) {
  stat.test <- res %>%
    group_by(selection_name, problem_name, offset) %>%
    filter(max(value) > 0) %>% # Sorting networks have some values of 0, which won't work for Wilcox test
    wilcox_test(value ~ Type) %>%
    adjust_pvalue(method = "bonferroni") %>%
    add_significance() 
  stat.test$label <- mapply(p_label,stat.test$p.adj)
  
  # Calculate effect sizes for these differences
  effect_sizes <- res %>%
    group_by(selection_name, problem_name, offset) %>%
    filter(max(value) > 0) %>%
    wilcox_effsize(value ~ Type)
  
  stat.test$effsize <- effect_sizes$effsize
  stat.test$magnitude <- effect_sizes$magnitude
  
  stat.test %>%
    kbl() %>%
    kable_styling(
      bootstrap_options = c(
        "striped",
        "hover",
        "condensed",
        "responsive"
      )
    ) %>%
    scroll_box(width="800px")
}

Transfer entropy from diversity to fitness

Max pairwise distance vs. phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  fit_phylo_10 = condinformation(discretize(max_performance), discretize(lag(max_phenotype_pairwise_distance, 1)), discretize(lag(max_performance, 1))),
  fit_phylo_100 = condinformation(discretize(max_performance), discretize(lag(max_phenotype_pairwise_distance, 10)), discretize(lag(max_performance, 10))),
  fit_phylo_1000 = condinformation(discretize(max_performance), discretize(lag(max_phenotype_pairwise_distance, 100)), discretize(lag(max_performance, 100))),
    fit_pheno_10 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 1)), discretize(lag(max_performance, 1))),
      fit_pheno_100 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 10)), discretize(lag(max_performance, 10))),
      fit_pheno_1000 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 100)), discretize(lag(max_performance, 100)))
      )

res <- res %>% pivot_longer(cols=contains("o_10"))
res$offset <- str_extract(res$name, "[:digit:]*$")
res$Type <- case_when(str_detect(res$name, "phylo") ~ "Phylogenetic", TRUE ~ "Phenotypic")

ggplot(
  res %>% filter(str_detect(name, "fit_ph*")), 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_x_discrete("Lag") + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("") + 
  theme(legend.position = "bottom")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic Phylogenetic 60 60 1358.0 2.05e-02 1.0000000 ns p = 1 0.2117768 small
Eco-EA Count Odds 100 value Phenotypic Phylogenetic 60 60 739.0 0.00e+00 0.0000015 **** p < 1e-04 0.5083601 large
Eco-EA Count Odds 1000 value Phenotypic Phylogenetic 60 60 1054.0 9.12e-05 0.0053808 ** p = 0.0053808 0.3574394 moderate
Eco-EA Logic-9 10 value Phenotypic Phylogenetic 60 60 1771.0 8.81e-01 1.0000000 ns p = 1 0.0138951 small
Eco-EA Logic-9 100 value Phenotypic Phylogenetic 60 60 1769.0 8.73e-01 1.0000000 ns p = 1 0.0148534 small
Eco-EA Logic-9 1000 value Phenotypic Phylogenetic 60 60 2028.0 2.30e-01 1.0000000 ns p = 1 0.1097388 small
Eco-EA NK Landscape 10 value Phenotypic Phylogenetic 60 60 1576.5 2.42e-01 1.0000000 ns p = 1 0.1070864 small
Eco-EA NK Landscape 100 value Phenotypic Phylogenetic 60 60 1536.5 1.67e-01 1.0000000 ns p = 1 0.1262518 small
Eco-EA NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1788.0 9.52e-01 1.0000000 ns p = 1 0.0057497 small
Eco-EA Sorting network 10 value Phenotypic Phylogenetic 60 60 2070.0 1.57e-01 1.0000000 ns p = 1 0.1295248 small
Eco-EA Sorting network 100 value Phenotypic Phylogenetic 60 60 1838.0 8.44e-01 1.0000000 ns p = 1 0.0182073 small
Eco-EA Sorting network 1000 value Phenotypic Phylogenetic 60 60 1800.0 1.00e+00 1.0000000 ns p = 1 0.0000000 small
Fitness sharing Count Odds 10 value Phenotypic Phylogenetic 60 60 1631.0 3.76e-01 1.0000000 ns p = 1 0.0809735 small
Fitness sharing Count Odds 100 value Phenotypic Phylogenetic 60 60 1257.0 4.41e-03 0.2601900 ns p = 0.26019 0.2601692 small
Fitness sharing Count Odds 1000 value Phenotypic Phylogenetic 60 60 1501.0 1.17e-01 1.0000000 ns p = 1 0.1432608 small
Fitness sharing Logic-9 10 value Phenotypic Phylogenetic 60 60 1511.0 1.30e-01 1.0000000 ns p = 1 0.1384718 small
Fitness sharing Logic-9 100 value Phenotypic Phylogenetic 60 60 1309.0 1.00e-02 0.5900000 ns p = 0.59 0.2352584 small
Fitness sharing Logic-9 1000 value Phenotypic Phylogenetic 60 60 1629.5 3.71e-01 1.0000000 ns p = 1 0.0819116 small
Fitness sharing NK Landscape 10 value Phenotypic Phylogenetic 60 60 1196.0 1.54e-03 0.0908600 ns p = 0.09086 0.2893963 small
Fitness sharing NK Landscape 100 value Phenotypic Phylogenetic 60 60 562.0 0.00e+00 0.0000000 **** p < 1e-04 0.5931666 large
Fitness sharing NK Landscape 1000 value Phenotypic Phylogenetic 60 60 477.0 0.00e+00 0.0000000 **** p < 1e-04 0.6338929 large
Fitness sharing Sorting network 10 value Phenotypic Phylogenetic 60 60 820.0 3.00e-07 0.0000161 **** p < 1e-04 0.4695503 moderate
Fitness sharing Sorting network 100 value Phenotypic Phylogenetic 60 60 366.0 0.00e+00 0.0000000 **** p < 1e-04 0.6870767 large
Fitness sharing Sorting network 1000 value Phenotypic Phylogenetic 60 60 1349.0 1.81e-02 1.0000000 ns p = 1 0.2160890 small
Lexicase Count Odds 10 value Phenotypic Phylogenetic 60 60 1579.0 2.47e-01 1.0000000 ns p = 1 0.1058884 small
Lexicase Count Odds 100 value Phenotypic Phylogenetic 60 60 285.0 0.00e+00 0.0000000 **** p < 1e-04 0.7258865 large
Lexicase Count Odds 1000 value Phenotypic Phylogenetic 60 60 694.0 0.00e+00 0.0000004 **** p < 1e-04 0.5299211 large
Lexicase Logic-9 10 value Phenotypic Phylogenetic 60 60 1963.5 3.92e-01 1.0000000 ns p = 1 0.0783384 small
Lexicase Logic-9 100 value Phenotypic Phylogenetic 60 60 1490.5 1.05e-01 1.0000000 ns p = 1 0.1482919 small
Lexicase Logic-9 1000 value Phenotypic Phylogenetic 60 60 1830.0 8.77e-01 1.0000000 ns p = 1 0.0144184 small
Lexicase NK Landscape 10 value Phenotypic Phylogenetic 60 60 1752.0 8.02e-01 1.0000000 ns p = 1 0.0231457 small
Lexicase NK Landscape 100 value Phenotypic Phylogenetic 60 60 1311.0 9.87e-03 0.5823300 ns p = 0.58233 0.2357967 small
Lexicase NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1064.0 1.02e-04 0.0060180 ** p = 0.006018 0.3549006 moderate
Lexicase Sorting network 10 value Phenotypic Phylogenetic 60 60 1814.0 9.27e-01 1.0000000 ns p = 1 0.0086195 small
Lexicase Sorting network 100 value Phenotypic Phylogenetic 60 60 1798.5 9.95e-01 1.0000000 ns p = 1 0.0009235 small
Random Count Odds 10 value Phenotypic Phylogenetic 60 60 1699.0 5.98e-01 1.0000000 ns p = 1 0.0483924 small
Random Count Odds 100 value Phenotypic Phylogenetic 60 60 1700.0 6.02e-01 1.0000000 ns p = 1 0.0479133 small
Random Count Odds 1000 value Phenotypic Phylogenetic 60 60 921.0 4.00e-06 0.0002366 *** p = 0.00023659 0.4211579 moderate
Random Logic-9 10 value Phenotypic Phylogenetic 60 60 1924.5 4.62e-01 1.0000000 ns p = 1 0.0673727 small
Random Logic-9 100 value Phenotypic Phylogenetic 60 60 1807.0 9.69e-01 1.0000000 ns p = 1 0.0037879 small
Random Logic-9 1000 value Phenotypic Phylogenetic 60 60 1775.0 8.62e-01 1.0000000 ns p = 1 0.0161606 small
Random NK Landscape 10 value Phenotypic Phylogenetic 60 60 1150.0 6.52e-04 0.0384680
p = 0.038468 0.3114364 moderate
Random NK Landscape 100 value Phenotypic Phylogenetic 60 60 629.0 0.00e+00 0.0000000 **** p < 1e-04 0.5610647 large
Random NK Landscape 1000 value Phenotypic Phylogenetic 60 60 524.0 0.00e+00 0.0000000 **** p < 1e-04 0.6113737 large
Random Sorting network 10 value Phenotypic Phylogenetic 60 60 1862.0 7.47e-01 1.0000000 ns p = 1 0.0297062 small
Random Sorting network 100 value Phenotypic Phylogenetic 60 60 990.0 2.15e-05 0.0012685 ** p = 0.0012685 0.3880977 moderate
Random Sorting network 1000 value Phenotypic Phylogenetic 60 60 839.0 5.00e-07 0.0000273 **** p < 1e-04 0.4604468 moderate
Tournament Count Odds 10 value Phenotypic Phylogenetic 60 60 1577.0 2.43e-01 1.0000000 ns p = 1 0.1068467 small
Tournament Count Odds 100 value Phenotypic Phylogenetic 60 60 1441.0 5.99e-02 1.0000000 ns p = 1 0.1720087 small
Tournament Count Odds 1000 value Phenotypic Phylogenetic 60 60 1573.0 2.34e-01 1.0000000 ns p = 1 0.1087738 small
Tournament Logic-9 10 value Phenotypic Phylogenetic 60 60 1956.0 4.14e-01 1.0000000 ns p = 1 0.0747460 small
Tournament Logic-9 100 value Phenotypic Phylogenetic 60 60 1978.0 3.52e-01 1.0000000 ns p = 1 0.0852872 small
Tournament Logic-9 1000 value Phenotypic Phylogenetic 60 60 2040.5 2.02e-01 1.0000000 ns p = 1 0.1168182 small
Tournament NK Landscape 10 value Phenotypic Phylogenetic 60 60 1802.0 9.89e-01 1.0000000 ns p = 1 0.0016220 small
Tournament NK Landscape 100 value Phenotypic Phylogenetic 60 60 1790.0 9.33e-01 1.0000000 ns p = 1 0.0081098 small
Tournament NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1792.0 9.47e-01 1.0000000 ns p = 1 0.0064879 small
Tournament Sorting network 10 value Phenotypic Phylogenetic 60 60 1964.0 3.91e-01 1.0000000 ns p = 1 0.0785827 small
Tournament Sorting network 100 value Phenotypic Phylogenetic 60 60 1330.0 1.37e-02 0.8083000 ns p = 0.8083 0.2251925 small
Tournament Sorting network 1000 value Phenotypic Phylogenetic 60 60 1816.5 9.29e-01 1.0000000 ns p = 1 0.0083936 small

Mean pairwise distance vs. phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  fit_phylo_10 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_pairwise_distance, 1)), discretize(lag(max_performance, 1))),
  fit_phylo_100 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_pairwise_distance, 10)), discretize(lag(max_performance, 10))),
  fit_phylo_1000 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_pairwise_distance, 100)), discretize(lag(max_performance, 100))),
    fit_pheno_10 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 1)), discretize(lag(max_performance, 1))),
      fit_pheno_100 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 10)), discretize(lag(max_performance, 10))),
      fit_pheno_1000 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 100)), discretize(lag(max_performance, 100)))
      )

res <- res %>% pivot_longer(cols=contains("o_10"))
res$offset <- str_extract(res$name, "[:digit:]*$")
res$Type <- case_when(str_detect(res$name, "phylo") ~ "Phylogenetic", TRUE ~ "Phenotypic")

ggplot(
  res %>% filter(str_detect(name, "fit_ph*")), 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_x_discrete("Lag") + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("") + 
  theme(legend.position = "bottom")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic Phylogenetic 60 60 1623.0 3.54e-01 1.0000000 ns p = 1 0.0848065 small
Eco-EA Count Odds 100 value Phenotypic Phylogenetic 60 60 1031.0 5.49e-05 0.0032391 ** p = 0.0032391 0.3684533 moderate
Eco-EA Count Odds 1000 value Phenotypic Phylogenetic 60 60 1304.0 9.30e-03 0.5487000 ns p = 0.5487 0.2376541 small
Eco-EA Logic-9 10 value Phenotypic Phylogenetic 60 60 1770.0 8.77e-01 1.0000000 ns p = 1 0.0143742 small
Eco-EA Logic-9 100 value Phenotypic Phylogenetic 60 60 1713.0 6.50e-01 1.0000000 ns p = 1 0.0416853 small
Eco-EA Logic-9 1000 value Phenotypic Phylogenetic 60 60 1688.0 5.57e-01 1.0000000 ns p = 1 0.0538785 small
Eco-EA NK Landscape 10 value Phenotypic Phylogenetic 60 60 1484.5 9.83e-02 1.0000000 ns p = 1 0.1511667 small
Eco-EA NK Landscape 100 value Phenotypic Phylogenetic 60 60 1584.5 2.59e-01 1.0000000 ns p = 1 0.1032533 small
Eco-EA NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1782.0 9.27e-01 1.0000000 ns p = 1 0.0086245 small
Eco-EA Sorting network 10 value Phenotypic Phylogenetic 60 60 2062.5 1.69e-01 1.0000000 ns p = 1 0.1259317 small
Eco-EA Sorting network 100 value Phenotypic Phylogenetic 60 60 1936.0 4.77e-01 1.0000000 ns p = 1 0.0651642 small
Eco-EA Sorting network 1000 value Phenotypic Phylogenetic 60 60 1799.0 9.93e-01 1.0000000 ns p = 1 0.0015407 small
Fitness sharing Count Odds 10 value Phenotypic Phylogenetic 60 60 1674.0 5.10e-01 1.0000000 ns p = 1 0.0603708 small
Fitness sharing Count Odds 100 value Phenotypic Phylogenetic 60 60 1252.0 4.06e-03 0.2395400 ns p = 0.23954 0.2625649 small
Fitness sharing Count Odds 1000 value Phenotypic Phylogenetic 60 60 1611.0 3.22e-01 1.0000000 ns p = 1 0.0905561 small
Fitness sharing Logic-9 10 value Phenotypic Phylogenetic 60 60 1491.0 1.05e-01 1.0000000 ns p = 1 0.1480547 small
Fitness sharing Logic-9 100 value Phenotypic Phylogenetic 60 60 1260.0 4.63e-03 0.2731700 ns p = 0.27317 0.2587363 small
Fitness sharing Logic-9 1000 value Phenotypic Phylogenetic 60 60 1520.0 1.41e-01 1.0000000 ns p = 1 0.1345174 small
Fitness sharing NK Landscape 10 value Phenotypic Phylogenetic 60 60 1285.0 6.93e-03 0.4088700 ns p = 0.40887 0.2467535 small
Fitness sharing NK Landscape 100 value Phenotypic Phylogenetic 60 60 683.0 0.00e+00 0.0000003 **** p < 1e-04 0.5351915 large
Fitness sharing NK Landscape 1000 value Phenotypic Phylogenetic 60 60 697.0 0.00e+00 0.0000004 **** p < 1e-04 0.5284837 large
Fitness sharing Sorting network 10 value Phenotypic Phylogenetic 60 60 905.0 2.70e-06 0.0001575 *** p = 0.00015753 0.4288240 moderate
Fitness sharing Sorting network 100 value Phenotypic Phylogenetic 60 60 361.0 0.00e+00 0.0000000 **** p < 1e-04 0.6894724 large
Fitness sharing Sorting network 1000 value Phenotypic Phylogenetic 60 60 1043.0 7.17e-05 0.0042303 ** p = 0.0042303 0.3627037 moderate
Lexicase Count Odds 10 value Phenotypic Phylogenetic 60 60 1491.0 1.05e-01 1.0000000 ns p = 1 0.1480521 small
Lexicase Count Odds 100 value Phenotypic Phylogenetic 60 60 367.0 0.00e+00 0.0000000 **** p < 1e-04 0.6865976 large
Lexicase Count Odds 1000 value Phenotypic Phylogenetic 60 60 870.0 1.10e-06 0.0000631 **** p < 1e-04 0.4455937 moderate
Lexicase Logic-9 10 value Phenotypic Phylogenetic 60 60 1785.5 9.41e-01 1.0000000 ns p = 1 0.0069474 small
Lexicase Logic-9 100 value Phenotypic Phylogenetic 60 60 1461.5 7.61e-02 1.0000000 ns p = 1 0.1621868 small
Lexicase Logic-9 1000 value Phenotypic Phylogenetic 60 60 1600.0 2.94e-01 1.0000000 ns p = 1 0.0961228 small
Lexicase NK Landscape 10 value Phenotypic Phylogenetic 60 60 1742.0 7.61e-01 1.0000000 ns p = 1 0.0279677 small
Lexicase NK Landscape 100 value Phenotypic Phylogenetic 60 60 1342.0 1.57e-02 0.9263000 ns p = 0.9263 0.2208485 small
Lexicase NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1034.0 5.26e-05 0.0031034 ** p = 0.0031034 0.3693667 moderate
Lexicase Sorting network 10 value Phenotypic Phylogenetic 60 60 1831.0 8.37e-01 1.0000000 ns p = 1 0.0190860 small
Lexicase Sorting network 100 value Phenotypic Phylogenetic 60 60 1814.0 9.27e-01 1.0000000 ns p = 1 0.0086195 small
Random Count Odds 10 value Phenotypic Phylogenetic 60 60 1753.0 8.07e-01 1.0000000 ns p = 1 0.0225193 small
Random Count Odds 100 value Phenotypic Phylogenetic 60 60 1963.0 3.94e-01 1.0000000 ns p = 1 0.0780987 small
Random Count Odds 1000 value Phenotypic Phylogenetic 60 60 1176.0 1.07e-03 0.0631300 ns p = 0.06313 0.2989790 small
Random Logic-9 10 value Phenotypic Phylogenetic 60 60 1787.5 9.43e-01 1.0000000 ns p = 1 0.0067643 small
Random Logic-9 100 value Phenotypic Phylogenetic 60 60 1753.5 7.85e-01 1.0000000 ns p = 1 0.0251621 small
Random Logic-9 1000 value Phenotypic Phylogenetic 60 60 1730.0 6.23e-01 1.0000000 ns p = 1 0.0452501 small
Random NK Landscape 10 value Phenotypic Phylogenetic 60 60 1158.0 7.60e-04 0.0448400
p = 0.04484 0.3076034 moderate
Random NK Landscape 100 value Phenotypic Phylogenetic 60 60 1087.0 1.84e-04 0.0108560
p = 0.010856 0.3416218 moderate
Random NK Landscape 1000 value Phenotypic Phylogenetic 60 60 822.0 3.00e-07 0.0000171 **** p < 1e-04 0.4685921 moderate
Random Sorting network 10 value Phenotypic Phylogenetic 60 60 1849.0 7.99e-01 1.0000000 ns p = 1 0.0234775 small
Random Sorting network 100 value Phenotypic Phylogenetic 60 60 1072.0 1.34e-04 0.0079060 ** p = 0.007906 0.3488088 moderate
Random Sorting network 1000 value Phenotypic Phylogenetic 60 60 895.0 2.10e-06 0.0001215 *** p = 0.00012154 0.4336153 moderate
Tournament Count Odds 10 value Phenotypic Phylogenetic 60 60 1545.0 1.82e-01 1.0000000 ns p = 1 0.1221789 small
Tournament Count Odds 100 value Phenotypic Phylogenetic 60 60 1196.0 1.54e-03 0.0908600 ns p = 0.09086 0.2893963 small
Tournament Count Odds 1000 value Phenotypic Phylogenetic 60 60 1821.5 9.12e-01 1.0000000 ns p = 1 0.0103029 small
Tournament Logic-9 10 value Phenotypic Phylogenetic 60 60 1895.0 6.20e-01 1.0000000 ns p = 1 0.0455184 small
Tournament Logic-9 100 value Phenotypic Phylogenetic 60 60 1727.0 7.04e-01 1.0000000 ns p = 1 0.0349773 small
Tournament Logic-9 1000 value Phenotypic Phylogenetic 60 60 1715.0 6.54e-01 1.0000000 ns p = 1 0.0411561 small
Tournament NK Landscape 10 value Phenotypic Phylogenetic 60 60 1794.0 9.61e-01 1.0000000 ns p = 1 0.0048659 small
Tournament NK Landscape 100 value Phenotypic Phylogenetic 60 60 1782.0 8.76e-01 1.0000000 ns p = 1 0.0145977 small
Tournament NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1784.0 8.90e-01 1.0000000 ns p = 1 0.0129757 small
Tournament Sorting network 10 value Phenotypic Phylogenetic 60 60 1760.5 8.38e-01 1.0000000 ns p = 1 0.0189269 small
Tournament Sorting network 100 value Phenotypic Phylogenetic 60 60 1335.0 1.48e-02 0.8732000 ns p = 0.8732 0.2227968 small
Tournament Sorting network 1000 value Phenotypic Phylogenetic 60 60 1833.5 8.54e-01 1.0000000 ns p = 1 0.0170991 small

Mean pairwise distance vs. phenotypic Shannon diversity

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  fit_phylo_10 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_pairwise_distance, 1)), discretize(lag(max_performance, 1))),
  fit_phylo_100 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_pairwise_distance, 10)), discretize(lag(max_performance, 10))),
  fit_phylo_1000 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_pairwise_distance, 100)), discretize(lag(max_performance, 100))),
    fit_pheno_10 = condinformation(discretize(max_performance), discretize(lag(phenotype_diversity, 1)), discretize(lag(max_performance, 1))),
      fit_pheno_100 = condinformation(discretize(max_performance), discretize(lag(phenotype_diversity, 10)), discretize(lag(max_performance, 10))),
      fit_pheno_1000 = condinformation(discretize(max_performance), discretize(lag(phenotype_diversity, 100)), discretize(lag(max_performance, 100)))
      )

res <- res %>% pivot_longer(cols=contains("o_10"))
res$offset <- str_extract(res$name, "[:digit:]*$")
res$Type <- case_when(str_detect(res$name, "phylo") ~ "Phylogenetic", TRUE ~ "Phenotypic")

ggplot(
  res %>% filter(str_detect(name, "fit_ph*")), 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_x_discrete("Lag") + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("") + 
  theme(legend.position = "bottom")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic Phylogenetic 60 60 1749.0 7.91e-01 1.0000000 ns p = 1 0.0244358 small
Eco-EA Count Odds 100 value Phenotypic Phylogenetic 60 60 1190.0 1.38e-03 0.0814200 ns p = 0.08142 0.2922711 small
Eco-EA Count Odds 1000 value Phenotypic Phylogenetic 60 60 1328.0 1.33e-02 0.7847000 ns p = 0.7847 0.2261547 small
Eco-EA Logic-9 10 value Phenotypic Phylogenetic 60 60 1746.0 7.79e-01 1.0000000 ns p = 1 0.0258736 small
Eco-EA Logic-9 100 value Phenotypic Phylogenetic 60 60 1703.0 6.13e-01 1.0000000 ns p = 1 0.0464767 small
Eco-EA Logic-9 1000 value Phenotypic Phylogenetic 60 60 1517.0 1.36e-01 1.0000000 ns p = 1 0.1362109 small
Eco-EA NK Landscape 10 value Phenotypic Phylogenetic 60 60 1721.5 6.82e-01 1.0000000 ns p = 1 0.0376120 small
Eco-EA NK Landscape 100 value Phenotypic Phylogenetic 60 60 1595.5 2.84e-01 1.0000000 ns p = 1 0.0979829 small
Eco-EA NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1744.0 7.71e-01 1.0000000 ns p = 1 0.0268319 small
Eco-EA Sorting network 10 value Phenotypic Phylogenetic 60 60 1804.0 9.85e-01 1.0000000 ns p = 1 0.0019190 small
Eco-EA Sorting network 100 value Phenotypic Phylogenetic 60 60 1145.0 5.91e-04 0.0348690
p = 0.034869 0.3138561 moderate
Eco-EA Sorting network 1000 value Phenotypic Phylogenetic 60 60 1799.0 9.93e-01 1.0000000 ns p = 1 0.0015407 small
Fitness sharing Count Odds 10 value Phenotypic Phylogenetic 60 60 1670.0 4.97e-01 1.0000000 ns p = 1 0.0622873 small
Fitness sharing Count Odds 100 value Phenotypic Phylogenetic 60 60 1207.0 1.87e-03 0.1103300 ns p = 0.11033 0.2841259 small
Fitness sharing Count Odds 1000 value Phenotypic Phylogenetic 60 60 1555.0 1.99e-01 1.0000000 ns p = 1 0.1173876 small
Fitness sharing Logic-9 10 value Phenotypic Phylogenetic 60 60 1573.0 2.35e-01 1.0000000 ns p = 1 0.1087651 small
Fitness sharing Logic-9 100 value Phenotypic Phylogenetic 60 60 1313.0 1.07e-02 0.6313000 ns p = 0.6313 0.2333418 small
Fitness sharing Logic-9 1000 value Phenotypic Phylogenetic 60 60 1455.0 6.98e-02 1.0000000 ns p = 1 0.1657446 small
Fitness sharing NK Landscape 10 value Phenotypic Phylogenetic 60 60 1268.0 5.28e-03 0.3115200 ns p = 0.31152 0.2548987 small
Fitness sharing NK Landscape 100 value Phenotypic Phylogenetic 60 60 691.0 0.00e+00 0.0000004 **** p < 1e-04 0.5313585 large
Fitness sharing NK Landscape 1000 value Phenotypic Phylogenetic 60 60 617.0 0.00e+00 0.0000000 **** p < 1e-04 0.5668143 large
Fitness sharing Sorting network 10 value Phenotypic Phylogenetic 60 60 874.0 1.20e-06 0.0000702 **** p < 1e-04 0.4436771 moderate
Fitness sharing Sorting network 100 value Phenotypic Phylogenetic 60 60 332.0 0.00e+00 0.0000000 **** p < 1e-04 0.7033672 large
Fitness sharing Sorting network 1000 value Phenotypic Phylogenetic 60 60 906.0 2.70e-06 0.0001617 *** p = 0.00016166 0.4283449 moderate
Lexicase Count Odds 10 value Phenotypic Phylogenetic 60 60 1404.0 3.79e-02 1.0000000 ns p = 1 0.1897367 small
Lexicase Count Odds 100 value Phenotypic Phylogenetic 60 60 368.0 0.00e+00 0.0000000 **** p < 1e-04 0.6861184 large
Lexicase Count Odds 1000 value Phenotypic Phylogenetic 60 60 827.0 3.00e-07 0.0000196 **** p < 1e-04 0.4661964 moderate
Lexicase Logic-9 10 value Phenotypic Phylogenetic 60 60 1722.5 6.86e-01 1.0000000 ns p = 1 0.0371329 small
Lexicase Logic-9 100 value Phenotypic Phylogenetic 60 60 1579.5 2.48e-01 1.0000000 ns p = 1 0.1056490 small
Lexicase Logic-9 1000 value Phenotypic Phylogenetic 60 60 1617.0 3.36e-01 1.0000000 ns p = 1 0.0880337 small
Lexicase NK Landscape 10 value Phenotypic Phylogenetic 60 60 1755.0 8.14e-01 1.0000000 ns p = 1 0.0216991 small
Lexicase NK Landscape 100 value Phenotypic Phylogenetic 60 60 1327.0 1.26e-02 0.7434000 ns p = 0.7434 0.2280815 small
Lexicase NK Landscape 1000 value Phenotypic Phylogenetic 60 60 971.0 1.21e-05 0.0007139 *** p = 0.0007139 0.3997454 moderate
Lexicase Sorting network 10 value Phenotypic Phylogenetic 60 60 1785.5 9.25e-01 1.0000000 ns p = 1 0.0089276 small
Lexicase Sorting network 100 value Phenotypic Phylogenetic 60 60 1748.0 7.28e-01 1.0000000 ns p = 1 0.0320154 small
Random Count Odds 10 value Phenotypic Phylogenetic 60 60 1776.0 9.02e-01 1.0000000 ns p = 1 0.0114992 small
Random Count Odds 100 value Phenotypic Phylogenetic 60 60 1991.0 3.17e-01 1.0000000 ns p = 1 0.0915144 small
Random Count Odds 1000 value Phenotypic Phylogenetic 60 60 1110.0 2.96e-04 0.0174640
p = 0.017464 0.3306018 moderate
Random Logic-9 10 value Phenotypic Phylogenetic 60 60 1934.0 4.28e-01 1.0000000 ns p = 1 0.0725501 small
Random Logic-9 100 value Phenotypic Phylogenetic 60 60 1854.5 7.49e-01 1.0000000 ns p = 1 0.0294925 small
Random Logic-9 1000 value Phenotypic Phylogenetic 60 60 1749.0 7.21e-01 1.0000000 ns p = 1 0.0329683 small
Random NK Landscape 10 value Phenotypic Phylogenetic 60 60 1063.0 1.11e-04 0.0065490 ** p = 0.006549 0.3531210 moderate
Random NK Landscape 100 value Phenotypic Phylogenetic 60 60 1322.0 1.22e-02 0.7198000 ns p = 0.7198 0.2290256 small
Random NK Landscape 1000 value Phenotypic Phylogenetic 60 60 865.0 9.00e-07 0.0000552 **** p < 1e-04 0.4479893 moderate
Random Sorting network 10 value Phenotypic Phylogenetic 60 60 1731.0 7.19e-01 1.0000000 ns p = 1 0.0330602 small
Random Sorting network 100 value Phenotypic Phylogenetic 60 60 1397.0 3.46e-02 1.0000000 ns p = 1 0.1930906 small
Random Sorting network 1000 value Phenotypic Phylogenetic 60 60 1008.0 3.26e-05 0.0019234 ** p = 0.0019234 0.3794733 moderate
Tournament Count Odds 10 value Phenotypic Phylogenetic 60 60 1601.0 2.97e-01 1.0000000 ns p = 1 0.0953475 small
Tournament Count Odds 100 value Phenotypic Phylogenetic 60 60 1368.0 2.35e-02 1.0000000 ns p = 1 0.2069854 small
Tournament Count Odds 1000 value Phenotypic Phylogenetic 60 60 1761.0 8.40e-01 1.0000000 ns p = 1 0.0186901 small
Tournament Logic-9 10 value Phenotypic Phylogenetic 60 60 1790.5 9.62e-01 1.0000000 ns p = 1 0.0045519 small
Tournament Logic-9 100 value Phenotypic Phylogenetic 60 60 1731.0 7.19e-01 1.0000000 ns p = 1 0.0330607 small
Tournament Logic-9 1000 value Phenotypic Phylogenetic 60 60 1601.0 2.93e-01 1.0000000 ns p = 1 0.0962637 small
Tournament NK Landscape 10 value Phenotypic Phylogenetic 60 60 1794.5 9.65e-01 1.0000000 ns p = 1 0.0044604 small
Tournament NK Landscape 100 value Phenotypic Phylogenetic 60 60 1794.0 9.61e-01 1.0000000 ns p = 1 0.0048659 small
Tournament NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1800.0 1.00e+00 1.0000000 ns p = 1 0.0000000 small
Tournament Sorting network 10 value Phenotypic Phylogenetic 60 60 1811.5 9.54e-01 1.0000000 ns p = 1 0.0055104 small
Tournament Sorting network 100 value Phenotypic Phylogenetic 60 60 1548.5 1.88e-01 1.0000000 ns p = 1 0.1205024 small
Tournament Sorting network 1000 value Phenotypic Phylogenetic 60 60 1779.0 9.09e-01 1.0000000 ns p = 1 0.0107189 small

Mean evolutionary distinctiveness vs. phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  fit_phylo_10 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_evolutionary_distinctiveness, 1)), discretize(lag(max_performance, 1))),
  fit_phylo_100 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_evolutionary_distinctiveness, 10)), discretize(lag(max_performance, 10))),
  fit_phylo_1000 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_evolutionary_distinctiveness, 100)), discretize(lag(max_performance, 100))),
    fit_pheno_10 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 1)), discretize(lag(max_performance, 1))),
      fit_pheno_100 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 10)), discretize(lag(max_performance, 10))),
      fit_pheno_1000 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 100)), discretize(lag(max_performance, 100)))
      )

res <- res %>% pivot_longer(cols=contains("o_10"))
res$offset <- str_extract(res$name, "[:digit:]*$")
res$Type <- case_when(str_detect(res$name, "phylo") ~ "Phylogenetic", TRUE ~ "Phenotypic")

ggplot(
  res %>% filter(str_detect(name, "fit_ph*")), 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_x_discrete("Lag") + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("") + 
  theme(legend.position = "bottom")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic Phylogenetic 60 60 1653.0 4.42e-01 1.0000000 ns p = 1 0.0704325 small
Eco-EA Count Odds 100 value Phenotypic Phylogenetic 60 60 1180.0 1.15e-03 0.0678500 ns p = 0.06785 0.2970624 small
Eco-EA Count Odds 1000 value Phenotypic Phylogenetic 60 60 1315.0 1.10e-02 0.6490000 ns p = 0.649 0.2323835 small
Eco-EA Logic-9 10 value Phenotypic Phylogenetic 60 60 1842.0 8.28e-01 1.0000000 ns p = 1 0.0201239 small
Eco-EA Logic-9 100 value Phenotypic Phylogenetic 60 60 1556.0 2.01e-01 1.0000000 ns p = 1 0.1169105 small
Eco-EA Logic-9 1000 value Phenotypic Phylogenetic 60 60 1591.0 2.72e-01 1.0000000 ns p = 1 0.1005939 small
Eco-EA NK Landscape 10 value Phenotypic Phylogenetic 60 60 1417.5 4.50e-02 1.0000000 ns p = 1 0.1832687 small
Eco-EA NK Landscape 100 value Phenotypic Phylogenetic 60 60 1487.5 1.02e-01 1.0000000 ns p = 1 0.1497293 small
Eco-EA NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1505.0 1.22e-01 1.0000000 ns p = 1 0.1413467 small
Eco-EA Sorting network 10 value Phenotypic Phylogenetic 60 60 1674.0 5.10e-01 1.0000000 ns p = 1 0.0604466 small
Eco-EA Sorting network 100 value Phenotypic Phylogenetic 60 60 1269.5 5.40e-03 0.3186000 ns p = 0.3186 0.2541924 small
Eco-EA Sorting network 1000 value Phenotypic Phylogenetic 60 60 1798.0 9.80e-01 1.0000000 ns p = 1 0.0030814 small
Fitness sharing Count Odds 10 value Phenotypic Phylogenetic 60 60 1721.0 6.80e-01 1.0000000 ns p = 1 0.0378515 small
Fitness sharing Count Odds 100 value Phenotypic Phylogenetic 60 60 1518.0 1.40e-01 1.0000000 ns p = 1 0.1351155 small
Fitness sharing Count Odds 1000 value Phenotypic Phylogenetic 60 60 1870.0 7.15e-01 1.0000000 ns p = 1 0.0335393 small
Fitness sharing Logic-9 10 value Phenotypic Phylogenetic 60 60 1611.0 3.22e-01 1.0000000 ns p = 1 0.0905577 small
Fitness sharing Logic-9 100 value Phenotypic Phylogenetic 60 60 1667.0 4.87e-01 1.0000000 ns p = 1 0.0637258 small
Fitness sharing Logic-9 1000 value Phenotypic Phylogenetic 60 60 1535.0 1.64e-01 1.0000000 ns p = 1 0.1273111 small
Fitness sharing NK Landscape 10 value Phenotypic Phylogenetic 60 60 1238.0 3.21e-03 0.1893900 ns p = 0.18939 0.2692727 small
Fitness sharing NK Landscape 100 value Phenotypic Phylogenetic 60 60 894.0 2.00e-06 0.0001186 *** p = 0.00011859 0.4340945 moderate
Fitness sharing NK Landscape 1000 value Phenotypic Phylogenetic 60 60 956.0 9.60e-06 0.0005634 *** p = 0.00056345 0.4043882 moderate
Fitness sharing Sorting network 10 value Phenotypic Phylogenetic 60 60 972.0 1.40e-05 0.0008260 *** p = 0.000826 0.3967221 moderate
Fitness sharing Sorting network 100 value Phenotypic Phylogenetic 60 60 1065.0 1.16e-04 0.0068440 ** p = 0.006844 0.3521627 moderate
Fitness sharing Sorting network 1000 value Phenotypic Phylogenetic 60 60 1780.0 9.18e-01 1.0000000 ns p = 1 0.0095827 small
Lexicase Count Odds 10 value Phenotypic Phylogenetic 60 60 1977.0 3.54e-01 1.0000000 ns p = 1 0.0848065 small
Lexicase Count Odds 100 value Phenotypic Phylogenetic 60 60 791.0 1.00e-07 0.0000071 **** p < 1e-04 0.4834452 moderate
Lexicase Count Odds 1000 value Phenotypic Phylogenetic 60 60 1038.0 6.42e-05 0.0037878 ** p = 0.0037878 0.3650993 moderate
Lexicase Logic-9 10 value Phenotypic Phylogenetic 60 60 1873.5 7.02e-01 1.0000000 ns p = 1 0.0352163 small
Lexicase Logic-9 100 value Phenotypic Phylogenetic 60 60 1266.5 5.15e-03 0.3038500 ns p = 0.30385 0.2556179 small
Lexicase Logic-9 1000 value Phenotypic Phylogenetic 60 60 1660.5 4.64e-01 1.0000000 ns p = 1 0.0671430 small
Lexicase NK Landscape 10 value Phenotypic Phylogenetic 60 60 1755.0 8.14e-01 1.0000000 ns p = 1 0.0216991 small
Lexicase NK Landscape 100 value Phenotypic Phylogenetic 60 60 1455.0 6.88e-02 1.0000000 ns p = 1 0.1663597 small
Lexicase NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1121.0 3.38e-04 0.0199420
p = 0.019942 0.3274151 moderate
Lexicase Sorting network 10 value Phenotypic Phylogenetic 60 60 1794.5 9.73e-01 1.0000000 ns p = 1 0.0033862 small
Lexicase Sorting network 100 value Phenotypic Phylogenetic 60 60 1735.0 6.64e-01 1.0000000 ns p = 1 0.0400189 small
Random Count Odds 10 value Phenotypic Phylogenetic 60 60 1583.0 2.56e-01 1.0000000 ns p = 1 0.1039719 small
Random Count Odds 100 value Phenotypic Phylogenetic 60 60 1932.0 4.90e-01 1.0000000 ns p = 1 0.0632456 small
Random Count Odds 1000 value Phenotypic Phylogenetic 60 60 1462.0 7.65e-02 1.0000000 ns p = 1 0.1619469 small
Random Logic-9 10 value Phenotypic Phylogenetic 60 60 1705.0 5.75e-01 1.0000000 ns p = 1 0.0514143 small
Random Logic-9 100 value Phenotypic Phylogenetic 60 60 1733.0 6.93e-01 1.0000000 ns p = 1 0.0362562 small
Random Logic-9 1000 value Phenotypic Phylogenetic 60 60 1771.5 8.43e-01 1.0000000 ns p = 1 0.0184230 small
Random NK Landscape 10 value Phenotypic Phylogenetic 60 60 1288.0 7.26e-03 0.4283400 ns p = 0.42834 0.2453161 small
Random NK Landscape 100 value Phenotypic Phylogenetic 60 60 1196.0 1.54e-03 0.0908600 ns p = 0.09086 0.2893963 small
Random NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1028.0 5.14e-05 0.0030326 ** p = 0.0030326 0.3698907 moderate
Random Sorting network 10 value Phenotypic Phylogenetic 60 60 2172.0 5.12e-02 1.0000000 ns p = 1 0.1782375 small
Random Sorting network 100 value Phenotypic Phylogenetic 60 60 1603.0 3.02e-01 1.0000000 ns p = 1 0.0943892 small
Random Sorting network 1000 value Phenotypic Phylogenetic 60 60 1629.0 3.71e-01 1.0000000 ns p = 1 0.0819317 small
Tournament Count Odds 10 value Phenotypic Phylogenetic 60 60 1570.0 2.28e-01 1.0000000 ns p = 1 0.1102006 small
Tournament Count Odds 100 value Phenotypic Phylogenetic 60 60 1026.0 4.91e-05 0.0028969 ** p = 0.0028969 0.3708489 moderate
Tournament Count Odds 1000 value Phenotypic Phylogenetic 60 60 1522.5 1.46e-01 1.0000000 ns p = 1 0.1329675 small
Tournament Logic-9 10 value Phenotypic Phylogenetic 60 60 1991.0 3.17e-01 1.0000000 ns p = 1 0.0915160 small
Tournament Logic-9 100 value Phenotypic Phylogenetic 60 60 1309.0 1.00e-02 0.5900000 ns p = 0.59 0.2352588 small
Tournament Logic-9 1000 value Phenotypic Phylogenetic 60 60 1604.0 3.00e-01 1.0000000 ns p = 1 0.0949012 small
Tournament NK Landscape 10 value Phenotypic Phylogenetic 60 60 1819.0 8.69e-01 1.0000000 ns p = 1 0.0154086 small
Tournament NK Landscape 100 value Phenotypic Phylogenetic 60 60 1780.0 8.62e-01 1.0000000 ns p = 1 0.0162196 small
Tournament NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1774.0 8.21e-01 1.0000000 ns p = 1 0.0210855 small
Tournament Sorting network 10 value Phenotypic Phylogenetic 60 60 1784.5 9.37e-01 1.0000000 ns p = 1 0.0074270 small
Tournament Sorting network 100 value Phenotypic Phylogenetic 60 60 854.0 7.00e-07 0.0000411 **** p < 1e-04 0.4532606 moderate
Tournament Sorting network 1000 value Phenotypic Phylogenetic 60 60 1750.5 7.84e-01 1.0000000 ns p = 1 0.0252657 small

Mean evolutionary distinctiveness vs. phenotypic Shannon diveristy

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  fit_phylo_10 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_evolutionary_distinctiveness, 1)), discretize(lag(max_performance, 1))),
  fit_phylo_100 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_evolutionary_distinctiveness, 10)), discretize(lag(max_performance, 10))),
  fit_phylo_1000 = condinformation(discretize(max_performance), discretize(lag(mean_phenotype_evolutionary_distinctiveness, 100)), discretize(lag(max_performance, 100))),
    fit_pheno_10 = condinformation(discretize(max_performance), discretize(lag(phenotype_diversity, 1)), discretize(lag(max_performance, 1))),
      fit_pheno_100 = condinformation(discretize(max_performance), discretize(lag(phenotype_diversity, 10)), discretize(lag(max_performance, 10))),
      fit_pheno_1000 = condinformation(discretize(max_performance), discretize(lag(phenotype_diversity, 100)), discretize(lag(max_performance, 100)))
      )

res <- res %>% pivot_longer(cols=contains("o_10"))
res$offset <- str_extract(res$name, "[:digit:]*$")
res$Type <- case_when(str_detect(res$name, "phylo") ~ "Phylogenetic", TRUE ~ "Phenotypic")

ggplot(
  res %>% filter(str_detect(name, "fit_ph*")), 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_x_discrete("Lag") + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("") + 
  theme(legend.position = "bottom")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic Phylogenetic 60 60 1740.0 7.55e-01 1.0000000 ns p = 1 0.0287480 small
Eco-EA Count Odds 100 value Phenotypic Phylogenetic 60 60 1389.0 3.12e-02 1.0000000 ns p = 1 0.1969237 small
Eco-EA Count Odds 1000 value Phenotypic Phylogenetic 60 60 1325.0 1.28e-02 0.7552000 ns p = 0.7552 0.2275921 small
Eco-EA Logic-9 10 value Phenotypic Phylogenetic 60 60 1826.0 8.94e-01 1.0000000 ns p = 1 0.0124577 small
Eco-EA Logic-9 100 value Phenotypic Phylogenetic 60 60 1565.0 2.18e-01 1.0000000 ns p = 1 0.1125982 small
Eco-EA Logic-9 1000 value Phenotypic Phylogenetic 60 60 1441.5 5.89e-02 1.0000000 ns p = 1 0.1726482 small
Eco-EA NK Landscape 10 value Phenotypic Phylogenetic 60 60 1631.5 3.78e-01 1.0000000 ns p = 1 0.0807340 small
Eco-EA NK Landscape 100 value Phenotypic Phylogenetic 60 60 1524.5 1.49e-01 1.0000000 ns p = 1 0.1320014 small
Eco-EA NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1469.0 8.28e-02 1.0000000 ns p = 1 0.1585958 small
Eco-EA Sorting network 10 value Phenotypic Phylogenetic 60 60 1667.5 4.88e-01 1.0000000 ns p = 1 0.0635682 small
Eco-EA Sorting network 100 value Phenotypic Phylogenetic 60 60 789.0 1.00e-07 0.0000067 **** p < 1e-04 0.4844421 moderate
Eco-EA Sorting network 1000 value Phenotypic Phylogenetic 60 60 1798.0 9.80e-01 1.0000000 ns p = 1 0.0030814 small
Fitness sharing Count Odds 10 value Phenotypic Phylogenetic 60 60 1733.0 7.27e-01 1.0000000 ns p = 1 0.0321019 small
Fitness sharing Count Odds 100 value Phenotypic Phylogenetic 60 60 1431.0 5.31e-02 1.0000000 ns p = 1 0.1768001 small
Fitness sharing Count Odds 1000 value Phenotypic Phylogenetic 60 60 1823.0 9.06e-01 1.0000000 ns p = 1 0.0110201 small
Fitness sharing Logic-9 10 value Phenotypic Phylogenetic 60 60 1722.0 6.84e-01 1.0000000 ns p = 1 0.0373730 small
Fitness sharing Logic-9 100 value Phenotypic Phylogenetic 60 60 1727.0 7.04e-01 1.0000000 ns p = 1 0.0349773 small
Fitness sharing Logic-9 1000 value Phenotypic Phylogenetic 60 60 1455.0 6.98e-02 1.0000000 ns p = 1 0.1657446 small
Fitness sharing NK Landscape 10 value Phenotypic Phylogenetic 60 60 1218.0 2.27e-03 0.1339300 ns p = 0.13393 0.2788554 small
Fitness sharing NK Landscape 100 value Phenotypic Phylogenetic 60 60 911.0 3.10e-06 0.0001835 *** p = 0.00018349 0.4259492 moderate
Fitness sharing NK Landscape 1000 value Phenotypic Phylogenetic 60 60 877.0 1.30e-06 0.0000761 **** p < 1e-04 0.4422397 moderate
Fitness sharing Sorting network 10 value Phenotypic Phylogenetic 60 60 907.0 2.80e-06 0.0001658 *** p = 0.00016579 0.4278658 moderate
Fitness sharing Sorting network 100 value Phenotypic Phylogenetic 60 60 941.0 6.60e-06 0.0003900 *** p = 0.00038999 0.4115752 moderate
Fitness sharing Sorting network 1000 value Phenotypic Phylogenetic 60 60 1587.0 2.65e-01 1.0000000 ns p = 1 0.1020560 small
Lexicase Count Odds 10 value Phenotypic Phylogenetic 60 60 1891.0 6.35e-01 1.0000000 ns p = 1 0.0436011 small
Lexicase Count Odds 100 value Phenotypic Phylogenetic 60 60 716.0 0.00e+00 0.0000008 **** p < 1e-04 0.5193801 large
Lexicase Count Odds 1000 value Phenotypic Phylogenetic 60 60 1038.0 6.42e-05 0.0037878 ** p = 0.0037878 0.3650993 moderate
Lexicase Logic-9 10 value Phenotypic Phylogenetic 60 60 1837.5 8.46e-01 1.0000000 ns p = 1 0.0179675 small
Lexicase Logic-9 100 value Phenotypic Phylogenetic 60 60 1370.5 2.43e-02 1.0000000 ns p = 1 0.2057880 small
Lexicase Logic-9 1000 value Phenotypic Phylogenetic 60 60 1668.0 4.88e-01 1.0000000 ns p = 1 0.0636086 small
Lexicase NK Landscape 10 value Phenotypic Phylogenetic 60 60 1774.0 8.93e-01 1.0000000 ns p = 1 0.0125373 small
Lexicase NK Landscape 100 value Phenotypic Phylogenetic 60 60 1418.0 4.39e-02 1.0000000 ns p = 1 0.1842011 small
Lexicase NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1044.0 6.59e-05 0.0038881 ** p = 0.0038881 0.3645447 moderate
Lexicase Sorting network 10 value Phenotypic Phylogenetic 60 60 1742.0 6.98e-01 1.0000000 ns p = 1 0.0357093 small
Lexicase Sorting network 100 value Phenotypic Phylogenetic 60 60 1722.0 6.01e-01 1.0000000 ns p = 1 0.0480229 small
Random Count Odds 10 value Phenotypic Phylogenetic 60 60 1610.0 3.20e-01 1.0000000 ns p = 1 0.0910353 small
Random Count Odds 100 value Phenotypic Phylogenetic 60 60 1961.0 4.00e-01 1.0000000 ns p = 1 0.0771404 small
Random Count Odds 1000 value Phenotypic Phylogenetic 60 60 1478.0 9.15e-02 1.0000000 ns p = 1 0.1542808 small
Random Logic-9 10 value Phenotypic Phylogenetic 60 60 1826.0 8.80e-01 1.0000000 ns p = 1 0.0140841 small
Random Logic-9 100 value Phenotypic Phylogenetic 60 60 1773.5 8.77e-01 1.0000000 ns p = 1 0.0143423 small
Random Logic-9 1000 value Phenotypic Phylogenetic 60 60 1813.0 9.29e-01 1.0000000 ns p = 1 0.0084038 small
Random NK Landscape 10 value Phenotypic Phylogenetic 60 60 1240.0 3.32e-03 0.1958800 ns p = 0.19588 0.2683145 small
Random NK Landscape 100 value Phenotypic Phylogenetic 60 60 1437.0 5.71e-02 1.0000000 ns p = 1 0.1739253 small
Random NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1089.0 1.92e-04 0.0113280
p = 0.011328 0.3406635 moderate
Random Sorting network 10 value Phenotypic Phylogenetic 60 60 2056.0 1.80e-01 1.0000000 ns p = 1 0.1226580 small
Random Sorting network 100 value Phenotypic Phylogenetic 60 60 1935.0 4.80e-01 1.0000000 ns p = 1 0.0646830 small
Random Sorting network 1000 value Phenotypic Phylogenetic 60 60 1739.0 7.51e-01 1.0000000 ns p = 1 0.0292271 small
Tournament Count Odds 10 value Phenotypic Phylogenetic 60 60 1606.0 3.10e-01 1.0000000 ns p = 1 0.0929518 small
Tournament Count Odds 100 value Phenotypic Phylogenetic 60 60 1217.0 2.23e-03 0.1315700 ns p = 0.13157 0.2793345 small
Tournament Count Odds 1000 value Phenotypic Phylogenetic 60 60 1487.0 1.01e-01 1.0000000 ns p = 1 0.1499832 small
Tournament Logic-9 10 value Phenotypic Phylogenetic 60 60 1879.0 6.80e-01 1.0000000 ns p = 1 0.0378523 small
Tournament Logic-9 100 value Phenotypic Phylogenetic 60 60 1337.0 1.52e-02 0.8968000 ns p = 0.8968 0.2218428 small
Tournament Logic-9 1000 value Phenotypic Phylogenetic 60 60 1517.0 1.34e-01 1.0000000 ns p = 1 0.1368976 small
Tournament NK Landscape 10 value Phenotypic Phylogenetic 60 60 1816.0 8.90e-01 1.0000000 ns p = 1 0.0129757 small
Tournament NK Landscape 100 value Phenotypic Phylogenetic 60 60 1785.0 8.98e-01 1.0000000 ns p = 1 0.0121647 small
Tournament NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1782.0 8.76e-01 1.0000000 ns p = 1 0.0145977 small
Tournament Sorting network 10 value Phenotypic Phylogenetic 60 60 1859.5 7.57e-01 1.0000000 ns p = 1 0.0285101 small
Tournament Sorting network 100 value Phenotypic Phylogenetic 60 60 1063.0 1.11e-04 0.0065490 ** p = 0.006549 0.3531222 moderate
Tournament Sorting network 1000 value Phenotypic Phylogenetic 60 60 1717.5 6.47e-01 1.0000000 ns p = 1 0.0421095 small

Variance evolutionary distinctiveness vs. phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  fit_phylo_10 = condinformation(discretize(max_performance), discretize(lag(variance_phenotype_evolutionary_distinctiveness, 1)), discretize(lag(max_performance, 1))),
  fit_phylo_100 = condinformation(discretize(max_performance), discretize(lag(variance_phenotype_evolutionary_distinctiveness, 10)), discretize(lag(max_performance, 10))),
  fit_phylo_1000 = condinformation(discretize(max_performance), discretize(lag(variance_phenotype_evolutionary_distinctiveness, 100)), discretize(lag(max_performance, 100))),
    fit_pheno_10 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 1)), discretize(lag(max_performance, 1))),
      fit_pheno_100 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 10)), discretize(lag(max_performance, 10))),
      fit_pheno_1000 = condinformation(discretize(max_performance), discretize(lag(phenotype_num_taxa, 100)), discretize(lag(max_performance, 100)))
      )

res <- res %>% pivot_longer(cols=contains("o_10"))
res$offset <- str_extract(res$name, "[:digit:]*$")
res$Type <- case_when(str_detect(res$name, "phylo") ~ "Phylogenetic", TRUE ~ "Phenotypic")

ggplot(
  res %>% filter(str_detect(name, "fit_ph*")), 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_x_discrete("Lag") + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("") + 
  theme(legend.position = "bottom")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic Phylogenetic 60 60 1719.0 0.673000 1.000000 ns p = 1 0.0388098 small
Eco-EA Count Odds 100 value Phenotypic Phylogenetic 60 60 1139.0 0.000527 0.031093
p = 0.031093 0.3167069 moderate
Eco-EA Count Odds 1000 value Phenotypic Phylogenetic 60 60 1238.0 0.003210 0.189390 ns p = 0.18939 0.2692821 small
Eco-EA Logic-9 10 value Phenotypic Phylogenetic 60 60 1772.0 0.885000 1.000000 ns p = 1 0.0134160 small
Eco-EA Logic-9 100 value Phenotypic Phylogenetic 60 60 1278.0 0.006200 0.365800 ns p = 0.3658 0.2501118 small
Eco-EA Logic-9 1000 value Phenotypic Phylogenetic 60 60 1662.0 0.468000 1.000000 ns p = 1 0.0664209 small
Eco-EA NK Landscape 10 value Phenotypic Phylogenetic 60 60 1424.5 0.049000 1.000000 ns p = 1 0.1799147 small
Eco-EA NK Landscape 100 value Phenotypic Phylogenetic 60 60 1432.5 0.054100 1.000000 ns p = 1 0.1760817 small
Eco-EA NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1560.0 0.209000 1.000000 ns p = 1 0.1149939 small
Eco-EA Sorting network 10 value Phenotypic Phylogenetic 60 60 1927.5 0.504000 1.000000 ns p = 1 0.0611678 small
Eco-EA Sorting network 100 value Phenotypic Phylogenetic 60 60 2162.5 0.057400 1.000000 ns p = 1 0.1736866 small
Eco-EA Sorting network 1000 value Phenotypic Phylogenetic 60 60 1799.0 0.993000 1.000000 ns p = 1 0.0015407 small
Fitness sharing Count Odds 10 value Phenotypic Phylogenetic 60 60 2113.0 0.101000 1.000000 ns p = 1 0.1499686 small
Fitness sharing Count Odds 100 value Phenotypic Phylogenetic 60 60 2054.0 0.183000 1.000000 ns p = 1 0.1216998 small
Fitness sharing Count Odds 1000 value Phenotypic Phylogenetic 60 60 1782.0 0.927000 1.000000 ns p = 1 0.0086244 small
Fitness sharing Logic-9 10 value Phenotypic Phylogenetic 60 60 1642.0 0.408000 1.000000 ns p = 1 0.0757043 small
Fitness sharing Logic-9 100 value Phenotypic Phylogenetic 60 60 1389.0 0.031200 1.000000 ns p = 1 0.1969271 small
Fitness sharing Logic-9 1000 value Phenotypic Phylogenetic 60 60 1639.0 0.398000 1.000000 ns p = 1 0.0774129 small
Fitness sharing NK Landscape 10 value Phenotypic Phylogenetic 60 60 1410.0 0.040900 1.000000 ns p = 1 0.1868619 small
Fitness sharing NK Landscape 100 value Phenotypic Phylogenetic 60 60 1304.0 0.009300 0.548700 ns p = 0.5487 0.2376500 small
Fitness sharing NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1372.0 0.024800 1.000000 ns p = 1 0.2050689 small
Fitness sharing Sorting network 10 value Phenotypic Phylogenetic 60 60 1131.0 0.000450 0.026550
p = 0.02655 0.3205400 moderate
Fitness sharing Sorting network 100 value Phenotypic Phylogenetic 60 60 2299.0 0.008890 0.524510 ns p = 0.52451 0.2390874 small
Fitness sharing Sorting network 1000 value Phenotypic Phylogenetic 60 60 1952.0 0.427000 1.000000 ns p = 1 0.0728282 small
Lexicase Count Odds 10 value Phenotypic Phylogenetic 60 60 1861.0 0.751000 1.000000 ns p = 1 0.0292271 small
Lexicase Count Odds 100 value Phenotypic Phylogenetic 60 60 1282.0 0.006600 0.389400 ns p = 0.3894 0.2481909 small
Lexicase Count Odds 1000 value Phenotypic Phylogenetic 60 60 1178.0 0.001110 0.065490 ns p = 0.06549 0.2980207 small
Lexicase Logic-9 10 value Phenotypic Phylogenetic 60 60 1705.5 0.622000 1.000000 ns p = 1 0.0452781 small
Lexicase Logic-9 100 value Phenotypic Phylogenetic 60 60 1334.0 0.014600 0.861400 ns p = 0.8614 0.2232767 small
Lexicase Logic-9 1000 value Phenotypic Phylogenetic 60 60 1697.0 0.589000 1.000000 ns p = 1 0.0495490 small
Lexicase NK Landscape 10 value Phenotypic Phylogenetic 60 60 1765.0 0.855000 1.000000 ns p = 1 0.0168771 small
Lexicase NK Landscape 100 value Phenotypic Phylogenetic 60 60 1576.0 0.238000 1.000000 ns p = 1 0.1080132 small
Lexicase NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1346.0 0.016600 0.979400 ns p = 0.9794 0.2189197 small
Lexicase Sorting network 10 value Phenotypic Phylogenetic 60 60 1784.0 0.917000 1.000000 ns p = 1 0.0098507 small
Lexicase Sorting network 100 value Phenotypic Phylogenetic 60 60 1705.0 0.524000 1.000000 ns p = 1 0.0584883 small
Random Count Odds 10 value Phenotypic Phylogenetic 60 60 1721.0 0.680000 1.000000 ns p = 1 0.0378515 small
Random Count Odds 100 value Phenotypic Phylogenetic 60 60 1773.0 0.889000 1.000000 ns p = 1 0.0129366 small
Random Count Odds 1000 value Phenotypic Phylogenetic 60 60 1580.0 0.249000 1.000000 ns p = 1 0.1054093 small
Random Logic-9 10 value Phenotypic Phylogenetic 60 60 1728.0 0.672000 1.000000 ns p = 1 0.0389639 small
Random Logic-9 100 value Phenotypic Phylogenetic 60 60 1733.5 0.696000 1.000000 ns p = 1 0.0359860 small
Random Logic-9 1000 value Phenotypic Phylogenetic 60 60 1761.5 0.788000 1.000000 ns p = 1 0.0248872 small
Random NK Landscape 10 value Phenotypic Phylogenetic 60 60 1822.0 0.910000 1.000000 ns p = 1 0.0105409 small
Random NK Landscape 100 value Phenotypic Phylogenetic 60 60 1652.0 0.439000 1.000000 ns p = 1 0.0709117 small
Random NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1587.0 0.265000 1.000000 ns p = 1 0.1020553 small
Random Sorting network 10 value Phenotypic Phylogenetic 60 60 2113.0 0.101000 1.000000 ns p = 1 0.1499686 small
Random Sorting network 100 value Phenotypic Phylogenetic 60 60 1629.0 0.371000 1.000000 ns p = 1 0.0819317 small
Random Sorting network 1000 value Phenotypic Phylogenetic 60 60 1852.0 0.787000 1.000000 ns p = 1 0.0249149 small
Tournament Count Odds 10 value Phenotypic Phylogenetic 60 60 1633.0 0.382000 1.000000 ns p = 1 0.0800152 small
Tournament Count Odds 100 value Phenotypic Phylogenetic 60 60 1153.0 0.000691 0.040769
p = 0.040769 0.3099990 moderate
Tournament Count Odds 1000 value Phenotypic Phylogenetic 60 60 1599.5 0.294000 1.000000 ns p = 1 0.0960720 small
Tournament Logic-9 10 value Phenotypic Phylogenetic 60 60 1869.0 0.719000 1.000000 ns p = 1 0.0330607 small
Tournament Logic-9 100 value Phenotypic Phylogenetic 60 60 1284.0 0.006820 0.402380 ns p = 0.40238 0.2472369 small
Tournament Logic-9 1000 value Phenotypic Phylogenetic 60 60 1620.0 0.341000 1.000000 ns p = 1 0.0871542 small
Tournament NK Landscape 10 value Phenotypic Phylogenetic 60 60 1811.0 0.926000 1.000000 ns p = 1 0.0089208 small
Tournament NK Landscape 100 value Phenotypic Phylogenetic 60 60 1780.0 0.862000 1.000000 ns p = 1 0.0162196 small
Tournament NK Landscape 1000 value Phenotypic Phylogenetic 60 60 1775.0 0.828000 1.000000 ns p = 1 0.0202745 small
Tournament Sorting network 10 value Phenotypic Phylogenetic 60 60 1907.5 0.574000 1.000000 ns p = 1 0.0515099 small
Tournament Sorting network 100 value Phenotypic Phylogenetic 60 60 1287.0 0.007150 0.421850 ns p = 0.42185 0.2457952 small
Tournament Sorting network 1000 value Phenotypic Phylogenetic 60 60 1679.0 0.502000 1.000000 ns p = 1 0.0615535 small

Transfer entropy between types of diversity

While we’re calculating transfer entropy, we might as well also calculate it between phenotypic diversity and phylogenetic diversity, as these could potentially also be in a feedback loop.

Max pairwise distance and phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  phen_phylo_10 =      condinformation(discretize(phenotype_num_taxa), 
                                       discretize(lag(max_phenotype_pairwise_distance, 1)), 
                                       discretize(lag(phenotype_num_taxa, 1))),
  phen_phylo_100 =     condinformation(discretize(phenotype_num_taxa),
                                       discretize(lag(max_phenotype_pairwise_distance, 10)),
                                       discretize(lag(phenotype_num_taxa, 10))),
  pheno_phylo_1000 =   condinformation(discretize(phenotype_num_taxa),
                                       discretize(lag(max_phenotype_pairwise_distance, 100)),
                                       discretize(lag(phenotype_num_taxa, 100))),
  
  phylo_pheno_10 =     condinformation(discretize(max_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_num_taxa, 1)),
                                       discretize(lag(max_phenotype_pairwise_distance, 1))),
  phylo_pheno_100 =    condinformation(discretize(max_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_num_taxa, 10)),
                                       discretize(lag(max_phenotype_pairwise_distance, 10))),
  phylo_pheno_1000 =   condinformation(discretize(max_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_num_taxa, 100)),
                                       discretize(lag(max_phenotype_pairwise_distance, 100))))

# Turn Transfer Entropy columns into rows
res <- res %>% pivot_longer(cols=contains("phylo"))
# Pull lag into a column
res$offset <- str_extract(res$name, "[:digit:]*$")
# Make column indicating direction of transfer entropy
res$Type <- case_when(str_detect(res$name, "phylo_pheno") ~ "\nPhenotypic\n\t->\nPhylogenetic\n", TRUE ~ "\nPhylogenetic\n\t->\nPhenotypic\n")

ggplot(
  res, 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name* problem_name) + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 13.0 0.00e+00 0.0000000 **** p < 1e-04 0.8562106 large
Eco-EA Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 223.0 0.00e+00 0.0000000 **** p < 1e-04 0.7555927 large
Eco-EA Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 855.0 7.00e-07 0.0000429 **** p < 1e-04 0.4527807 moderate
Eco-EA Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1931.0 4.93e-01 1.0000000 ns p = 1 0.0627664 small
Eco-EA Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1919.0 5.34e-01 1.0000000 ns p = 1 0.0570168 small
Eco-EA Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1910.0 5.65e-01 1.0000000 ns p = 1 0.0527046 small
Eco-EA NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 88.0 0.00e+00 0.0000000 **** p < 1e-04 0.8202757 large
Eco-EA NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 601.0 0.00e+00 0.0000000 **** p < 1e-04 0.5744804 large
Eco-EA NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1137.0 5.07e-04 0.0304200
p = 0.03042 0.3176652 moderate
Eco-EA Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 104.0 0.00e+00 0.0000000 **** p < 1e-04 0.8126095 large
Eco-EA Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 893.0 2.00e-06 0.0001176 *** p = 0.0001176 0.4345736 moderate
Eco-EA Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1533.0 1.62e-01 1.0000000 ns p = 1 0.1279307 small
Fitness sharing Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 9.0 0.00e+00 0.0000000 **** p < 1e-04 0.8581272 large
Fitness sharing Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1754.0 8.11e-01 1.0000000 ns p = 1 0.0220401 small
Fitness sharing Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1966.0 3.85e-01 1.0000000 ns p = 1 0.0795361 small
Fitness sharing Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 661.0 0.00e+00 0.0000001 **** p < 1e-04 0.5457325 large
Fitness sharing Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 824.0 3.00e-07 0.0000183 **** p < 1e-04 0.4676338 moderate
Fitness sharing Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1273.0 5.72e-03 0.3432000 ns p = 0.3432 0.2525031 small
Fitness sharing NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Fitness sharing NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 6.0 0.00e+00 0.0000000 **** p < 1e-04 0.8595646 large
Fitness sharing NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 78.0 0.00e+00 0.0000000 **** p < 1e-04 0.8250670 large
Fitness sharing Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 13.0 0.00e+00 0.0000000 **** p < 1e-04 0.8562106 large
Fitness sharing Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2704.0 2.10e-06 0.0001266 *** p = 0.0001266 0.4331362 moderate
Fitness sharing Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2574.0 4.91e-05 0.0029460 ** p = 0.002946 0.3708489 moderate
Lexicase Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 21.0 0.00e+00 0.0000000 **** p < 1e-04 0.8523776 large
Lexicase Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 450.0 0.00e+00 0.0000000 **** p < 1e-04 0.6468295 large
Lexicase Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1406.0 3.89e-02 1.0000000 ns p = 1 0.1887784 small
Lexicase Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1553.0 1.96e-01 1.0000000 ns p = 1 0.1183458 small
Lexicase Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1409.0 4.04e-02 1.0000000 ns p = 1 0.1873410 small
Lexicase NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 8.0 0.00e+00 0.0000000 **** p < 1e-04 0.8586063 large
Lexicase Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 62.0 0.00e+00 0.0000000 **** p < 1e-04 0.8327331 large
Lexicase Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 239.0 0.00e+00 0.0000000 **** p < 1e-04 0.7479266 large
Lexicase Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 30.0 0.00e+00 0.0000000 **** p < 1e-04 0.9099165 large
Random Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Random Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 12.0 0.00e+00 0.0000000 **** p < 1e-04 0.8566898 large
Random Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 61.0 0.00e+00 0.0000000 **** p < 1e-04 0.8332123 large
Random Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 327.0 0.00e+00 0.0000000 **** p < 1e-04 0.7057629 large
Random Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 924.0 4.30e-06 0.0002592 *** p = 0.0002592 0.4197205 moderate
Random Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1283.0 6.71e-03 0.4026000 ns p = 0.4026 0.2477118 small
Random NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Random NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Random NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 40.0 0.00e+00 0.0000000 **** p < 1e-04 0.8432740 large
Random Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 155.0 0.00e+00 0.0000000 **** p < 1e-04 0.7881738 large
Random Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 212.0 0.00e+00 0.0000000 **** p < 1e-04 0.7608632 large
Random Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 126.0 0.00e+00 0.0000000 **** p < 1e-04 0.8020686 large
Tournament Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1761.0 8.40e-01 1.0000000 ns p = 1 0.0186862 small
Tournament Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2479.0 3.69e-04 0.0221400
p = 0.02214 0.3253313 moderate
Tournament Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2207.0 3.29e-02 1.0000000 ns p = 1 0.1950071 small
Tournament Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2835.0 1.00e-07 0.0000034 **** p < 1e-04 0.4959026 moderate
Tournament Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2802.0 1.00e-07 0.0000088 **** p < 1e-04 0.4800912 moderate
Tournament Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2201.5 3.53e-02 1.0000000 ns p = 1 0.1923752 small
Tournament NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 308.0 0.00e+00 0.0000000 **** p < 1e-04 0.7148664 large
Tournament NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 682.0 0.00e+00 0.0000003 **** p < 1e-04 0.5356707 large
Tournament NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1216.5 2.21e-03 0.1326000 ns p = 0.1326 0.2795746 small
Tournament Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 586.0 0.00e+00 0.0000000 **** p < 1e-04 0.5816674 large
Tournament Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1292.0 7.73e-03 0.4638000 ns p = 0.4638 0.2433996 small
Tournament Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1090.5 1.98e-04 0.0118800
p = 0.01188 0.3399454 moderate

Mean pairwise distance and phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  phen_phylo_10 =      condinformation(discretize(phenotype_num_taxa), 
                                       discretize(lag(mean_phenotype_pairwise_distance, 1)), 
                                       discretize(lag(phenotype_num_taxa, 1))),
  phen_phylo_100 =     condinformation(discretize(phenotype_num_taxa),
                                       discretize(lag(mean_phenotype_pairwise_distance, 10)),
                                       discretize(lag(phenotype_num_taxa, 10))),
  pheno_phylo_1000 =   condinformation(discretize(phenotype_num_taxa),
                                       discretize(lag(mean_phenotype_pairwise_distance, 100)),
                                       discretize(lag(phenotype_num_taxa, 100))),
  
  phylo_pheno_10 =     condinformation(discretize(mean_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_num_taxa, 1)),
                                       discretize(lag(mean_phenotype_pairwise_distance, 1))),
  phylo_pheno_100 =    condinformation(discretize(mean_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_num_taxa, 10)),
                                       discretize(lag(mean_phenotype_pairwise_distance, 10))),
  phylo_pheno_1000 =   condinformation(discretize(mean_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_num_taxa, 100)),
                                       discretize(lag(mean_phenotype_pairwise_distance, 100)))
)

# Turn Transfer Entropy columns into rows
res <- res %>% pivot_longer(cols=contains("phylo"))
# Pull lag into a column
res$offset <- str_extract(res$name, "[:digit:]*$")
# Make column indicating direction of transfer entropy
res$Type <- case_when(str_detect(res$name, "phylo_pheno") ~ "\nPhenotypic\n\t->\nPhylogenetic\n", TRUE ~ "\nPhylogenetic\n\t->\nPhenotypic\n")

ggplot(
  res, 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 293.0 0.00e+00 0.0000000 **** p < 1e-04 0.7220534 large
Eco-EA Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 786.0 1.00e-07 0.0000062 **** p < 1e-04 0.4858408 moderate
Eco-EA Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1136.0 4.97e-04 0.0298200
p = 0.02982 0.3181443 moderate
Eco-EA Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1358.0 2.05e-02 1.0000000 ns p = 1 0.2117768 small
Eco-EA Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1973.0 3.65e-01 1.0000000 ns p = 1 0.0828900 small
Eco-EA Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1729.0 7.11e-01 1.0000000 ns p = 1 0.0340184 small
Eco-EA NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 103.0 0.00e+00 0.0000000 **** p < 1e-04 0.8130887 large
Eco-EA NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 929.0 4.90e-06 0.0002940 *** p = 0.000294 0.4173248 moderate
Eco-EA NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1215.0 2.16e-03 0.1296000 ns p = 0.1296 0.2802928 small
Eco-EA Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 63.0 0.00e+00 0.0000000 **** p < 1e-04 0.8322540 large
Eco-EA Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 798.0 1.00e-07 0.0000088 **** p < 1e-04 0.4800912 moderate
Eco-EA Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1946.0 4.45e-01 1.0000000 ns p = 1 0.0699546 small
Fitness sharing Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 8.0 0.00e+00 0.0000000 **** p < 1e-04 0.8586063 large
Fitness sharing Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1961.0 4.00e-01 1.0000000 ns p = 1 0.0771404 small
Fitness sharing Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1984.0 3.35e-01 1.0000000 ns p = 1 0.0881605 small
Fitness sharing Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 595.0 0.00e+00 0.0000000 **** p < 1e-04 0.5773552 large
Fitness sharing Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 884.0 1.60e-06 0.0000930 **** p < 1e-04 0.4388858 moderate
Fitness sharing Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 807.0 2.00e-07 0.0000114 **** p < 1e-04 0.4757790 moderate
Fitness sharing NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Fitness sharing NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 66.0 0.00e+00 0.0000000 **** p < 1e-04 0.8308166 large
Fitness sharing NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 339.0 0.00e+00 0.0000000 **** p < 1e-04 0.7000133 large
Fitness sharing Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 18.0 0.00e+00 0.0000000 **** p < 1e-04 0.8538150 large
Fitness sharing Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2969.0 0.00e+00 0.0000001 **** p < 1e-04 0.5601065 large
Fitness sharing Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2214.0 3.00e-02 1.0000000 ns p = 1 0.1983611 small
Lexicase Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1.0 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Lexicase Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 91.0 0.00e+00 0.0000000 **** p < 1e-04 0.8188383 large
Lexicase Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 766.0 1.00e-07 0.0000035 **** p < 1e-04 0.4954235 moderate
Lexicase Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1790.0 9.60e-01 1.0000000 ns p = 1 0.0047913 small
Lexicase Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1782.0 9.27e-01 1.0000000 ns p = 1 0.0086244 small
Lexicase Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1499.0 1.15e-01 1.0000000 ns p = 1 0.1442190 small
Lexicase NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 5.0 0.00e+00 0.0000000 **** p < 1e-04 0.8600452 large
Lexicase Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1354.0 1.87e-02 1.0000000 ns p = 1 0.2149192 small
Lexicase Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1484.0 9.64e-02 1.0000000 ns p = 1 0.1520143 small
Lexicase Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1646.0 4.20e-01 1.0000000 ns p = 1 0.0738231 small
Random Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1.0 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Random Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 45.0 0.00e+00 0.0000000 **** p < 1e-04 0.8408784 large
Random Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 286.0 0.00e+00 0.0000000 **** p < 1e-04 0.7254073 large
Random Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 540.0 0.00e+00 0.0000000 **** p < 1e-04 0.6037076 large
Random Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1017.0 4.01e-05 0.0024060 ** p = 0.002406 0.3751611 moderate
Random Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 903.0 2.50e-06 0.0001518 *** p = 0.0001518 0.4297823 moderate
Random NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Random NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 37.0 0.00e+00 0.0000000 **** p < 1e-04 0.8447114 large
Random NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 303.0 0.00e+00 0.0000000 **** p < 1e-04 0.7172621 large
Random Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 296.0 0.00e+00 0.0000000 **** p < 1e-04 0.7206160 large
Random Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 439.0 0.00e+00 0.0000000 **** p < 1e-04 0.6521000 large
Random Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 258.0 0.00e+00 0.0000000 **** p < 1e-04 0.7388231 large
Tournament Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 897.0 2.20e-06 0.0001302 *** p = 0.0001302 0.4326571 moderate
Tournament Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2506.0 2.13e-04 0.0127800
p = 0.01278 0.3382679 moderate
Tournament Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2557.0 7.17e-05 0.0043020 ** p = 0.004302 0.3627043 moderate
Tournament Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1086.0 1.80e-04 0.0108000
p = 0.0108 0.3421009 moderate
Tournament Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2600.0 2.71e-05 0.0016260 ** p = 0.001626 0.3833064 moderate
Tournament Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1995.0 3.07e-01 1.0000000 ns p = 1 0.0934309 small
Tournament NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 317.0 0.00e+00 0.0000000 **** p < 1e-04 0.7105542 large
Tournament NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 951.0 8.50e-06 0.0005070 *** p = 0.000507 0.4067839 moderate
Tournament NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1450.0 6.66e-02 1.0000000 ns p = 1 0.1676977 small
Tournament Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 259.0 0.00e+00 0.0000000 **** p < 1e-04 0.7383439 large
Tournament Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1489.0 1.03e-01 1.0000000 ns p = 1 0.1490104 small
Tournament Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1485.5 9.93e-02 1.0000000 ns p = 1 0.1506876 small

Mean pairwise distance and shannon diversity

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  phen_phylo_10 =      condinformation(discretize(phenotype_diversity), 
                                       discretize(lag(mean_phenotype_pairwise_distance, 1)), 
                                       discretize(lag(phenotype_diversity, 1))),
  phen_phylo_100 =     condinformation(discretize(phenotype_diversity),
                                       discretize(lag(mean_phenotype_pairwise_distance, 10)),
                                       discretize(lag(phenotype_diversity, 10))),
  pheno_phylo_1000 =   condinformation(discretize(phenotype_diversity),
                                       discretize(lag(mean_phenotype_pairwise_distance, 100)),
                                       discretize(lag(phenotype_diversity, 100))),
  phylo_pheno_10 =     condinformation(discretize(mean_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_diversity, 1)),
                                       discretize(lag(mean_phenotype_pairwise_distance, 1))),
  phylo_pheno_100 =    condinformation(discretize(mean_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_diversity, 10)),
                                       discretize(lag(mean_phenotype_pairwise_distance, 10))),
  phylo_pheno_1000 =   condinformation(discretize(mean_phenotype_pairwise_distance),
                                       discretize(lag(phenotype_diversity, 100)),
                                       discretize(lag(mean_phenotype_pairwise_distance, 100)))
  
)

# Turn Transfer Entropy columns into rows
res <- res %>% pivot_longer(cols=contains("phylo"))
# Pull lag into a column
res$offset <- str_extract(res$name, "[:digit:]*$")
# Make column indicating direction of transfer entropy
res$Type <- case_when(str_detect(res$name, "phylo_pheno") ~ "\nPhenotypic\n\t->\nPhylogenetic\n", TRUE ~ "\nPhylogenetic\n\t->\nPhenotypic\n")

ggplot(
  res, 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 690 0.00e+00 0.0000003 **** p < 1e-04 0.5318376 large
Eco-EA Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 879 1.40e-06 0.0000816 **** p < 1e-04 0.4412815 moderate
Eco-EA Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 942 6.80e-06 0.0004062 *** p = 0.0004062 0.4110961 moderate
Eco-EA Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1281 6.50e-03 0.3900000 ns p = 0.39 0.2486700 small
Eco-EA Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1816 9.35e-01 1.0000000 ns p = 1 0.0076661 small
Eco-EA Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1347 1.75e-02 1.0000000 ns p = 1 0.2170472 small
Eco-EA NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1125 4.00e-04 0.0240000
p = 0.024 0.3234148 moderate
Eco-EA NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1207 1.87e-03 0.1122000 ns p = 0.1122 0.2841259 small
Eco-EA NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1488 1.02e-01 1.0000000 ns p = 1 0.1494895 small
Eco-EA Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 485 0.00e+00 0.0000000 **** p < 1e-04 0.6300599 large
Eco-EA Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2799 2.00e-07 0.0000096 **** p < 1e-04 0.4786538 moderate
Eco-EA Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2342 4.48e-03 0.2688000 ns p = 0.2688 0.2596905 small
Fitness sharing Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 6 0.00e+00 0.0000000 **** p < 1e-04 0.8595646 large
Fitness sharing Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1853 7.83e-01 1.0000000 ns p = 1 0.0253940 small
Fitness sharing Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1953 4.23e-01 1.0000000 ns p = 1 0.0733073 small
Fitness sharing Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 678 0.00e+00 0.0000002 **** p < 1e-04 0.5375872 large
Fitness sharing Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 913 3.30e-06 0.0001962 *** p = 0.0001962 0.4249910 moderate
Fitness sharing Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 838 4.00e-07 0.0000270 **** p < 1e-04 0.4609259 moderate
Fitness sharing NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Fitness sharing NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 66 0.00e+00 0.0000000 **** p < 1e-04 0.8308166 large
Fitness sharing NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 323 0.00e+00 0.0000000 **** p < 1e-04 0.7076794 large
Fitness sharing Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 35 0.00e+00 0.0000000 **** p < 1e-04 0.8456697 large
Fitness sharing Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2967 0.00e+00 0.0000001 **** p < 1e-04 0.5591482 large
Fitness sharing Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2361 3.26e-03 0.1956000 ns p = 0.1956 0.2687936 small
Lexicase Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Lexicase Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 105 0.00e+00 0.0000000 **** p < 1e-04 0.8121304 large
Lexicase Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 803 2.00e-07 0.0000101 **** p < 1e-04 0.4776956 moderate
Lexicase Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1925 5.13e-01 1.0000000 ns p = 1 0.0598916 small
Lexicase Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2036 2.16e-01 1.0000000 ns p = 1 0.1130754 small
Lexicase Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1509 1.27e-01 1.0000000 ns p = 1 0.1394277 small
Lexicase NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Lexicase Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1837 8.08e-01 1.0000000 ns p = 1 0.0225336 small
Lexicase Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1781 9.04e-01 1.0000000 ns p = 1 0.0113385 small
Lexicase Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1551 1.89e-01 1.0000000 ns p = 1 0.1201541 small
Random Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Random Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 69 0.00e+00 0.0000000 **** p < 1e-04 0.8293792 large
Random Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 238 0.00e+00 0.0000000 **** p < 1e-04 0.7484057 large
Random Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3339 0.00e+00 0.0000000 **** p < 1e-04 0.7373857 large
Random Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2603 2.53e-05 0.0015180 ** p = 0.001518 0.3847438 moderate
Random Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1823 9.06e-01 1.0000000 ns p = 1 0.0110201 small
Random NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Random NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 50 0.00e+00 0.0000000 **** p < 1e-04 0.8384827 large
Random NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 290 0.00e+00 0.0000000 **** p < 1e-04 0.7234908 large
Random Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 593 0.00e+00 0.0000000 **** p < 1e-04 0.5783135 large
Random Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 354 0.00e+00 0.0000000 **** p < 1e-04 0.6928263 large
Random Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 323 0.00e+00 0.0000000 **** p < 1e-04 0.7076794 large
Tournament Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2170 5.25e-02 1.0000000 ns p = 1 0.1772792 small
Tournament Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2383 2.23e-03 0.1338000 ns p = 0.1338 0.2793345 small
Tournament Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2165 5.57e-02 1.0000000 ns p = 1 0.1748848 small
Tournament Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1703 6.13e-01 1.0000000 ns p = 1 0.0464759 small
Tournament Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2327 5.72e-03 0.3432000 ns p = 0.3432 0.2525031 small
Tournament Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1477 9.05e-02 1.0000000 ns p = 1 0.1547600 small
Tournament NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1401 3.65e-02 1.0000000 ns p = 1 0.1911741 small
Tournament NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1809 9.64e-01 1.0000000 ns p = 1 0.0043122 small
Tournament NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1939 4.67e-01 1.0000000 ns p = 1 0.0665999 small
Tournament Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 612 0.00e+00 0.0000000 **** p < 1e-04 0.5692100 large
Tournament Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1154 7.04e-04 0.0422400
p = 0.04224 0.3095199 moderate
Tournament Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1497 1.12e-01 1.0000000 ns p = 1 0.1451773 small

Mean evolutionary distinctiveness and phenotypic richness

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  phen_phylo_10 =      condinformation(
                          discretize(phenotype_num_taxa), 
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 1)), 
                          discretize(lag(phenotype_num_taxa, 1))),
  phen_phylo_100 =     condinformation(
                          discretize(phenotype_num_taxa),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 10)),
                          discretize(lag(phenotype_num_taxa, 10))),
  pheno_phylo_1000 =   condinformation(
                          discretize(phenotype_num_taxa),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 100)),
                          discretize(lag(phenotype_num_taxa, 100))),
  
  phylo_pheno_10 =     condinformation(
                          discretize(mean_phenotype_evolutionary_distinctiveness),
                          discretize(lag(phenotype_num_taxa, 1)),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 1))),
  phylo_pheno_100 =    condinformation(
                          discretize(mean_phenotype_evolutionary_distinctiveness),
                          discretize(lag(phenotype_num_taxa, 10)),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 10))),
  phylo_pheno_1000 =   condinformation(
                          discretize(mean_phenotype_evolutionary_distinctiveness),
                          discretize(lag(phenotype_num_taxa, 100)),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 100)))
)

# Turn Transfer Entropy columns into rows
res <- res %>% pivot_longer(cols=contains("phylo"))
# Pull lag into a column
res$offset <- str_extract(res$name, "[:digit:]*$")
# Make column indicating direction of transfer entropy
res$Type <- case_when(str_detect(res$name, "phylo_pheno") ~ "\nPhenotypic\n\t->\nPhylogenetic\n", TRUE ~ "\nPhylogenetic\n\t->\nPhenotypic\n")

ggplot(
  res, 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_y_continuous("Transfer Entropy") +  
  scale_color_discrete("")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 208 0.00e+00 0.0000000 **** p < 1e-04 0.7627797 large
Eco-EA Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1150 6.52e-04 0.0391200
p = 0.03912 0.3114364 moderate
Eco-EA Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1525 1.50e-01 1.0000000 ns p = 1 0.1317616 small
Eco-EA Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 58 0.00e+00 0.0000000 **** p < 1e-04 0.8346496 large
Eco-EA Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1069 1.26e-04 0.0075600 ** p = 0.00756 0.3502462 moderate
Eco-EA Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1944 4.51e-01 1.0000000 ns p = 1 0.0689951 small
Eco-EA NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Eco-EA NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 204 0.00e+00 0.0000000 **** p < 1e-04 0.7646962 large
Eco-EA NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 485 0.00e+00 0.0000000 **** p < 1e-04 0.6300599 large
Eco-EA Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Eco-EA Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Eco-EA Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 155 0.00e+00 0.0000000 **** p < 1e-04 0.7881751 large
Fitness sharing Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 453 0.00e+00 0.0000000 **** p < 1e-04 0.6453921 large
Fitness sharing Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1894 6.24e-01 1.0000000 ns p = 1 0.0450385 small
Fitness sharing Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2181 4.58e-02 1.0000000 ns p = 1 0.1825497 small
Fitness sharing Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1024 4.69e-05 0.0028140 ** p = 0.002814 0.3718072 moderate
Fitness sharing Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2288 1.05e-02 0.6300000 ns p = 0.63 0.2338169 small
Fitness sharing Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2254 1.73e-02 1.0000000 ns p = 1 0.2175264 small
Fitness sharing NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 106 0.00e+00 0.0000000 **** p < 1e-04 0.8116513 large
Fitness sharing NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 603 0.00e+00 0.0000000 **** p < 1e-04 0.5735222 large
Fitness sharing NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 823 3.00e-07 0.0000178 **** p < 1e-04 0.4681129 moderate
Fitness sharing Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2320 6.40e-03 0.3840000 ns p = 0.384 0.2491491 small
Fitness sharing Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3370 0.00e+00 0.0000000 **** p < 1e-04 0.7522388 large
Fitness sharing Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3170 0.00e+00 0.0000000 **** p < 1e-04 0.6564167 large
Lexicase Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 6 0.00e+00 0.0000000 **** p < 1e-04 0.8595646 large
Lexicase Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 128 0.00e+00 0.0000000 **** p < 1e-04 0.8011103 large
Lexicase Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 801 2.00e-07 0.0000096 **** p < 1e-04 0.4786538 moderate
Lexicase Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 876 1.30e-06 0.0000750 **** p < 1e-04 0.4427189 moderate
Lexicase Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1975 3.60e-01 1.0000000 ns p = 1 0.0838483 small
Lexicase Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2664 5.80e-06 0.0003504 *** p = 0.0003504 0.4139716 moderate
Lexicase NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 10 0.00e+00 0.0000000 **** p < 1e-04 0.8576480 large
Lexicase NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 26 0.00e+00 0.0000000 **** p < 1e-04 0.8499819 large
Lexicase NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 67 0.00e+00 0.0000000 **** p < 1e-04 0.8303375 large
Lexicase Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624409 large
Lexicase Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 67 0.00e+00 0.0000000 **** p < 1e-04 0.8303389 large
Random Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 285 0.00e+00 0.0000000 **** p < 1e-04 0.7258865 large
Random Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 995 2.42e-05 0.0014520 ** p = 0.001452 0.3857020 moderate
Random Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1148 6.27e-04 0.0376200
p = 0.03762 0.3123947 moderate
Random Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 159 0.00e+00 0.0000000 **** p < 1e-04 0.7862572 large
Random Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 790 1.00e-07 0.0000070 **** p < 1e-04 0.4839243 moderate
Random Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 650 0.00e+00 0.0000001 **** p < 1e-04 0.5510029 large
Random NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 94 0.00e+00 0.0000000 **** p < 1e-04 0.8174009 large
Random NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 439 0.00e+00 0.0000000 **** p < 1e-04 0.6521000 large
Random NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 683 0.00e+00 0.0000003 **** p < 1e-04 0.5351915 large
Random Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1649 4.30e-01 1.0000000 ns p = 1 0.0723491 small
Random Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1652 4.39e-01 1.0000000 ns p = 1 0.0709117 small
Random Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2051 1.89e-01 1.0000000 ns p = 1 0.1202624 small
Tournament Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 339 0.00e+00 0.0000000 **** p < 1e-04 0.7000133 large
Tournament Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2222 2.69e-02 1.0000000 ns p = 1 0.2021941 small
Tournament Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2166 5.51e-02 1.0000000 ns p = 1 0.1753627 small
Tournament Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Tournament Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 491 0.00e+00 0.0000000 **** p < 1e-04 0.6271851 large
Tournament Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1873 7.04e-01 1.0000000 ns p = 1 0.0349767 small
Tournament NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Tournament NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Tournament NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 25 0.00e+00 0.0000000 **** p < 1e-04 0.8504640 large
Tournament Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 4 0.00e+00 0.0000000 **** p < 1e-04 0.8605228 large
Tournament Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 69 0.00e+00 0.0000000 **** p < 1e-04 0.8293792 large
Tournament Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 357 0.00e+00 0.0000000 **** p < 1e-04 0.6913889 large

Mean evolutionary distinctiveness and shannon diversity

res <- data %>% group_by(SEED, selection_name, problem_name) %>%
summarise(
  phen_phylo_10 =      condinformation(
                          discretize(phenotype_diversity), 
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 1)), 
                          discretize(lag(phenotype_diversity, 1))),
  phen_phylo_100 =     condinformation(
                          discretize(phenotype_diversity),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 10)),
                          discretize(lag(phenotype_diversity, 10))),
  pheno_phylo_1000 =   condinformation(
                          discretize(phenotype_diversity),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 100)),
                          discretize(lag(phenotype_diversity, 100))),
  
  phylo_pheno_10 =     condinformation(
                          discretize(mean_phenotype_evolutionary_distinctiveness),
                          discretize(lag(phenotype_diversity, 1)),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 1))),
  phylo_pheno_100 =    condinformation(
                          discretize(mean_phenotype_evolutionary_distinctiveness),
                          discretize(lag(phenotype_diversity, 10)),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 10))),
  phylo_pheno_1000 =   condinformation(
                          discretize(mean_phenotype_evolutionary_distinctiveness),
                          discretize(lag(phenotype_diversity, 100)),
                          discretize(lag(mean_phenotype_evolutionary_distinctiveness, 100)))
)

# Turn Transfer Entropy columns into rows
res <- res %>% pivot_longer(cols=contains("phylo"))
# Pull lag into a column
res$offset <- str_extract(res$name, "[:digit:]*$")
# Make column indicating direction of transfer entropy
res$Type <- case_when(str_detect(res$name, "phylo_pheno") ~ "\nPhenotypic\n\t->\nPhylogenetic\n", TRUE ~ "\nPhylogenetic\n\t->\nPhenotypic\n")

ggplot(
  res, 
  aes(
    x=as.factor(offset), 
    y=value, 
    color=Type
    )
  ) + 
  geom_boxplot() + 
  facet_wrap(~selection_name*problem_name, ncol=4) + 
  scale_y_continuous("Transfer Entropy") + 
  scale_color_discrete("")

# Determine which conditions are significantly different from each other
transfer_entropy_stats(res)
selection_name problem_name offset .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif label effsize magnitude
Eco-EA Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 565.0 0.00e+00 0.0000000 **** p < 1e-04 0.5917292 large
Eco-EA Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1273.0 5.72e-03 0.3432000 ns p = 0.3432 0.2525031 small
Eco-EA Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1148.0 6.27e-04 0.0376200
p = 0.03762 0.3123947 moderate
Eco-EA Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 67.0 0.00e+00 0.0000000 **** p < 1e-04 0.8303375 large
Eco-EA Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1078.0 1.53e-04 0.0091800 ** p = 0.00918 0.3459340 moderate
Eco-EA Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1665.5 4.82e-01 1.0000000 ns p = 1 0.0644435 small
Eco-EA NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 94.0 0.00e+00 0.0000000 **** p < 1e-04 0.8174009 large
Eco-EA NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 286.0 0.00e+00 0.0000000 **** p < 1e-04 0.7254073 large
Eco-EA NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 528.0 0.00e+00 0.0000000 **** p < 1e-04 0.6094571 large
Eco-EA Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3.0 0.00e+00 0.0000000 **** p < 1e-04 0.8610020 large
Eco-EA Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 69.0 0.00e+00 0.0000000 **** p < 1e-04 0.8293792 large
Eco-EA Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 244.0 0.00e+00 0.0000000 **** p < 1e-04 0.7455309 large
Fitness sharing Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 329.0 0.00e+00 0.0000000 **** p < 1e-04 0.7048046 large
Fitness sharing Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1742.0 7.63e-01 1.0000000 ns p = 1 0.0277897 small
Fitness sharing Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2174.0 5.00e-02 1.0000000 ns p = 1 0.1791957 small
Fitness sharing Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1184.0 1.24e-03 0.0744000 ns p = 0.0744 0.2951459 small
Fitness sharing Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2510.0 1.96e-04 0.0117600
p = 0.01176 0.3401844 moderate
Fitness sharing Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2409.0 1.40e-03 0.0840000 ns p = 0.084 0.2917920 small
Fitness sharing NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 151.0 0.00e+00 0.0000000 **** p < 1e-04 0.7900903 large
Fitness sharing NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 649.0 0.00e+00 0.0000001 **** p < 1e-04 0.5514821 large
Fitness sharing NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 814.0 2.00e-07 0.0000139 **** p < 1e-04 0.4724251 moderate
Fitness sharing Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2218.0 2.84e-02 1.0000000 ns p = 1 0.2002776 small
Fitness sharing Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3335.0 0.00e+00 0.0000000 **** p < 1e-04 0.7354691 large
Fitness sharing Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3084.0 0.00e+00 0.0000000 **** p < 1e-04 0.6152110 large
Lexicase Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 10.0 0.00e+00 0.0000000 **** p < 1e-04 0.8576480 large
Lexicase Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 158.0 0.00e+00 0.0000000 **** p < 1e-04 0.7867364 large
Lexicase Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 684.0 0.00e+00 0.0000003 **** p < 1e-04 0.5347124 large
Lexicase Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1057.0 9.73e-05 0.0058380 ** p = 0.005838 0.3559958 moderate
Lexicase Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2271.0 1.35e-02 0.8100000 ns p = 0.81 0.2256716 small
Lexicase Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2658.0 6.80e-06 0.0004062 *** p = 0.0004062 0.4110990 moderate
Lexicase NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1.0 0.00e+00 0.0000000 **** p < 1e-04 0.8619602 large
Lexicase NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 31.0 0.00e+00 0.0000000 **** p < 1e-04 0.8475862 large
Lexicase NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 188.0 0.00e+00 0.0000000 **** p < 1e-04 0.7723624 large
Lexicase Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Lexicase Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2.0 0.00e+00 0.0000000 **** p < 1e-04 0.8614811 large
Lexicase Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 51.0 0.00e+00 0.0000000 **** p < 1e-04 0.8380036 large
Random Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 503.0 0.00e+00 0.0000000 **** p < 1e-04 0.6214355 large
Random Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 839.0 5.00e-07 0.0000277 **** p < 1e-04 0.4604468 moderate
Random Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1057.0 9.73e-05 0.0058380 ** p = 0.005838 0.3559958 moderate
Random Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 3068.0 0.00e+00 0.0000000 **** p < 1e-04 0.6075406 large
Random Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1574.0 2.37e-01 1.0000000 ns p = 1 0.1082841 small
Random Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 859.0 8.00e-07 0.0000478 **** p < 1e-04 0.4508641 moderate
Random NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 41.0 0.00e+00 0.0000000 **** p < 1e-04 0.8427949 large
Random NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 408.0 0.00e+00 0.0000000 **** p < 1e-04 0.6669531 large
Random NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 801.0 2.00e-07 0.0000096 **** p < 1e-04 0.4786538 moderate
Random Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2374.0 2.61e-03 0.1566000 ns p = 0.1566 0.2750223 small
Random Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1762.0 8.44e-01 1.0000000 ns p = 1 0.0182071 small
Random Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 2371.0 2.75e-03 0.1650000 ns p = 0.165 0.2735849 small
Tournament Count Odds 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 668.0 0.00e+00 0.0000002 **** p < 1e-04 0.5423785 large
Tournament Count Odds 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1753.0 8.07e-01 1.0000000 ns p = 1 0.0225193 small
Tournament Count Odds 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1863.5 7.41e-01 1.0000000 ns p = 1 0.0304250 small
Tournament Logic-9 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 41.0 0.00e+00 0.0000000 **** p < 1e-04 0.8427949 large
Tournament Logic-9 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 497.0 0.00e+00 0.0000000 **** p < 1e-04 0.6243103 large
Tournament Logic-9 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 1392.0 3.25e-02 1.0000000 ns p = 1 0.1954863 small
Tournament NK Landscape 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 0.0 0.00e+00 0.0000000 **** p < 1e-04 0.8624394 large
Tournament NK Landscape 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 13.0 0.00e+00 0.0000000 **** p < 1e-04 0.8562106 large
Tournament NK Landscape 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 59.0 0.00e+00 0.0000000 **** p < 1e-04 0.8341705 large
Tournament Sorting network 10 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 9.0 0.00e+00 0.0000000 **** p < 1e-04 0.8581272 large
Tournament Sorting network 100 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 30.0 0.00e+00 0.0000000 **** p < 1e-04 0.8480654 large
Tournament Sorting network 1000 value Phenotypic -> Phylogenetic Phylogenetic -> Phenotypic 60 60 210.0 0.00e+00 0.0000000 **** p < 1e-04 0.7618214 large